1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file 11 /// SI implementation of the TargetRegisterInfo class. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "SIRegisterInfo.h" 16 #include "AMDGPURegisterBankInfo.h" 17 #include "AMDGPUSubtarget.h" 18 #include "SIInstrInfo.h" 19 #include "SIMachineFunctionInfo.h" 20 #include "MCTargetDesc/AMDGPUMCTargetDesc.h" 21 #include "llvm/CodeGen/MachineFrameInfo.h" 22 #include "llvm/CodeGen/MachineInstrBuilder.h" 23 #include "llvm/CodeGen/RegisterScavenging.h" 24 #include "llvm/IR/Function.h" 25 #include "llvm/IR/LLVMContext.h" 26 27 using namespace llvm; 28 29 static bool hasPressureSet(const int *PSets, unsigned PSetID) { 30 for (unsigned i = 0; PSets[i] != -1; ++i) { 31 if (PSets[i] == (int)PSetID) 32 return true; 33 } 34 return false; 35 } 36 37 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg, 38 BitVector &PressureSets) const { 39 for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) { 40 const int *PSets = getRegUnitPressureSets(*U); 41 if (hasPressureSet(PSets, PSetID)) { 42 PressureSets.set(PSetID); 43 break; 44 } 45 } 46 } 47 48 static cl::opt<bool> EnableSpillSGPRToSMEM( 49 "amdgpu-spill-sgpr-to-smem", 50 cl::desc("Use scalar stores to spill SGPRs if supported by subtarget"), 51 cl::init(false)); 52 53 static cl::opt<bool> EnableSpillSGPRToVGPR( 54 "amdgpu-spill-sgpr-to-vgpr", 55 cl::desc("Enable spilling VGPRs to SGPRs"), 56 cl::ReallyHidden, 57 cl::init(true)); 58 59 SIRegisterInfo::SIRegisterInfo(const GCNSubtarget &ST) : 60 AMDGPURegisterInfo(), 61 SGPRPressureSets(getNumRegPressureSets()), 62 VGPRPressureSets(getNumRegPressureSets()), 63 SpillSGPRToVGPR(false), 64 SpillSGPRToSMEM(false) { 65 if (EnableSpillSGPRToSMEM && ST.hasScalarStores()) 66 SpillSGPRToSMEM = true; 67 else if (EnableSpillSGPRToVGPR) 68 SpillSGPRToVGPR = true; 69 70 unsigned NumRegPressureSets = getNumRegPressureSets(); 71 72 SGPRSetID = NumRegPressureSets; 73 VGPRSetID = NumRegPressureSets; 74 75 for (unsigned i = 0; i < NumRegPressureSets; ++i) { 76 classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets); 77 classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets); 78 } 79 80 // Determine the number of reg units for each pressure set. 81 std::vector<unsigned> PressureSetRegUnits(NumRegPressureSets, 0); 82 for (unsigned i = 0, e = getNumRegUnits(); i != e; ++i) { 83 const int *PSets = getRegUnitPressureSets(i); 84 for (unsigned j = 0; PSets[j] != -1; ++j) { 85 ++PressureSetRegUnits[PSets[j]]; 86 } 87 } 88 89 unsigned VGPRMax = 0, SGPRMax = 0; 90 for (unsigned i = 0; i < NumRegPressureSets; ++i) { 91 if (isVGPRPressureSet(i) && PressureSetRegUnits[i] > VGPRMax) { 92 VGPRSetID = i; 93 VGPRMax = PressureSetRegUnits[i]; 94 continue; 95 } 96 if (isSGPRPressureSet(i) && PressureSetRegUnits[i] > SGPRMax) { 97 SGPRSetID = i; 98 SGPRMax = PressureSetRegUnits[i]; 99 } 100 } 101 102 assert(SGPRSetID < NumRegPressureSets && 103 VGPRSetID < NumRegPressureSets); 104 } 105 106 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg( 107 const MachineFunction &MF) const { 108 109 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 110 unsigned BaseIdx = alignDown(ST.getMaxNumSGPRs(MF), 4) - 4; 111 unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx)); 112 return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass); 113 } 114 115 static unsigned findPrivateSegmentWaveByteOffsetRegIndex(unsigned RegCount) { 116 unsigned Reg; 117 118 // Try to place it in a hole after PrivateSegmentBufferReg. 119 if (RegCount & 3) { 120 // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to 121 // alignment constraints, so we have a hole where can put the wave offset. 122 Reg = RegCount - 1; 123 } else { 124 // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the 125 // wave offset before it. 126 Reg = RegCount - 5; 127 } 128 129 return Reg; 130 } 131 132 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg( 133 const MachineFunction &MF) const { 134 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 135 unsigned Reg = findPrivateSegmentWaveByteOffsetRegIndex(ST.getMaxNumSGPRs(MF)); 136 return AMDGPU::SGPR_32RegClass.getRegister(Reg); 137 } 138 139 unsigned SIRegisterInfo::reservedStackPtrOffsetReg( 140 const MachineFunction &MF) const { 141 return AMDGPU::SGPR32; 142 } 143 144 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 145 BitVector Reserved(getNumRegs()); 146 147 // EXEC_LO and EXEC_HI could be allocated and used as regular register, but 148 // this seems likely to result in bugs, so I'm marking them as reserved. 149 reserveRegisterTuples(Reserved, AMDGPU::EXEC); 150 reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR); 151 152 // M0 has to be reserved so that llvm accepts it as a live-in into a block. 153 reserveRegisterTuples(Reserved, AMDGPU::M0); 154 155 // Reserve the memory aperture registers. 156 reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_BASE); 157 reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_LIMIT); 158 reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_BASE); 159 reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_LIMIT); 160 161 // Reserve xnack_mask registers - support is not implemented in Codegen. 162 reserveRegisterTuples(Reserved, AMDGPU::XNACK_MASK); 163 164 // Reserve Trap Handler registers - support is not implemented in Codegen. 165 reserveRegisterTuples(Reserved, AMDGPU::TBA); 166 reserveRegisterTuples(Reserved, AMDGPU::TMA); 167 reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1); 168 reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3); 169 reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5); 170 reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7); 171 reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9); 172 reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11); 173 reserveRegisterTuples(Reserved, AMDGPU::TTMP12_TTMP13); 174 reserveRegisterTuples(Reserved, AMDGPU::TTMP14_TTMP15); 175 176 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 177 178 unsigned MaxNumSGPRs = ST.getMaxNumSGPRs(MF); 179 unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs(); 180 for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) { 181 unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i); 182 reserveRegisterTuples(Reserved, Reg); 183 } 184 185 unsigned MaxNumVGPRs = ST.getMaxNumVGPRs(MF); 186 unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs(); 187 for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) { 188 unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i); 189 reserveRegisterTuples(Reserved, Reg); 190 } 191 192 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 193 194 unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg(); 195 if (ScratchWaveOffsetReg != AMDGPU::NoRegister) { 196 // Reserve 1 SGPR for scratch wave offset in case we need to spill. 197 reserveRegisterTuples(Reserved, ScratchWaveOffsetReg); 198 } 199 200 unsigned ScratchRSrcReg = MFI->getScratchRSrcReg(); 201 if (ScratchRSrcReg != AMDGPU::NoRegister) { 202 // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need 203 // to spill. 204 // TODO: May need to reserve a VGPR if doing LDS spilling. 205 reserveRegisterTuples(Reserved, ScratchRSrcReg); 206 assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg)); 207 } 208 209 // We have to assume the SP is needed in case there are calls in the function, 210 // which is detected after the function is lowered. If we aren't really going 211 // to need SP, don't bother reserving it. 212 unsigned StackPtrReg = MFI->getStackPtrOffsetReg(); 213 214 if (StackPtrReg != AMDGPU::NoRegister) { 215 reserveRegisterTuples(Reserved, StackPtrReg); 216 assert(!isSubRegister(ScratchRSrcReg, StackPtrReg)); 217 } 218 219 unsigned FrameReg = MFI->getFrameOffsetReg(); 220 if (FrameReg != AMDGPU::NoRegister) { 221 reserveRegisterTuples(Reserved, FrameReg); 222 assert(!isSubRegister(ScratchRSrcReg, FrameReg)); 223 } 224 225 return Reserved; 226 } 227 228 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const { 229 const SIMachineFunctionInfo *Info = Fn.getInfo<SIMachineFunctionInfo>(); 230 if (Info->isEntryFunction()) { 231 const MachineFrameInfo &MFI = Fn.getFrameInfo(); 232 return MFI.hasStackObjects() || MFI.hasCalls(); 233 } 234 235 // May need scavenger for dealing with callee saved registers. 236 return true; 237 } 238 239 bool SIRegisterInfo::requiresFrameIndexScavenging( 240 const MachineFunction &MF) const { 241 const MachineFrameInfo &MFI = MF.getFrameInfo(); 242 if (MFI.hasStackObjects()) 243 return true; 244 245 // May need to deal with callee saved registers. 246 const SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>(); 247 return !Info->isEntryFunction(); 248 } 249 250 bool SIRegisterInfo::requiresFrameIndexReplacementScavenging( 251 const MachineFunction &MF) const { 252 // m0 is needed for the scalar store offset. m0 is unallocatable, so we can't 253 // create a virtual register for it during frame index elimination, so the 254 // scavenger is directly needed. 255 return MF.getFrameInfo().hasStackObjects() && 256 MF.getSubtarget<GCNSubtarget>().hasScalarStores() && 257 MF.getInfo<SIMachineFunctionInfo>()->hasSpilledSGPRs(); 258 } 259 260 bool SIRegisterInfo::requiresVirtualBaseRegisters( 261 const MachineFunction &) const { 262 // There are no special dedicated stack or frame pointers. 263 return true; 264 } 265 266 bool SIRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const { 267 // This helps catch bugs as verifier errors. 268 return true; 269 } 270 271 int64_t SIRegisterInfo::getMUBUFInstrOffset(const MachineInstr *MI) const { 272 assert(SIInstrInfo::isMUBUF(*MI)); 273 274 int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), 275 AMDGPU::OpName::offset); 276 return MI->getOperand(OffIdx).getImm(); 277 } 278 279 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI, 280 int Idx) const { 281 if (!SIInstrInfo::isMUBUF(*MI)) 282 return 0; 283 284 assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(), 285 AMDGPU::OpName::vaddr) && 286 "Should never see frame index on non-address operand"); 287 288 return getMUBUFInstrOffset(MI); 289 } 290 291 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const { 292 if (!MI->mayLoadOrStore()) 293 return false; 294 295 int64_t FullOffset = Offset + getMUBUFInstrOffset(MI); 296 297 return !isUInt<12>(FullOffset); 298 } 299 300 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB, 301 unsigned BaseReg, 302 int FrameIdx, 303 int64_t Offset) const { 304 MachineBasicBlock::iterator Ins = MBB->begin(); 305 DebugLoc DL; // Defaults to "unknown" 306 307 if (Ins != MBB->end()) 308 DL = Ins->getDebugLoc(); 309 310 MachineFunction *MF = MBB->getParent(); 311 const GCNSubtarget &Subtarget = MF->getSubtarget<GCNSubtarget>(); 312 const SIInstrInfo *TII = Subtarget.getInstrInfo(); 313 314 if (Offset == 0) { 315 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg) 316 .addFrameIndex(FrameIdx); 317 return; 318 } 319 320 MachineRegisterInfo &MRI = MF->getRegInfo(); 321 unsigned OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 322 323 unsigned FIReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 324 325 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg) 326 .addImm(Offset); 327 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), FIReg) 328 .addFrameIndex(FrameIdx); 329 330 TII->getAddNoCarry(*MBB, Ins, DL, BaseReg) 331 .addReg(OffsetReg, RegState::Kill) 332 .addReg(FIReg); 333 } 334 335 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, 336 int64_t Offset) const { 337 338 MachineBasicBlock *MBB = MI.getParent(); 339 MachineFunction *MF = MBB->getParent(); 340 const GCNSubtarget &Subtarget = MF->getSubtarget<GCNSubtarget>(); 341 const SIInstrInfo *TII = Subtarget.getInstrInfo(); 342 343 #ifndef NDEBUG 344 // FIXME: Is it possible to be storing a frame index to itself? 345 bool SeenFI = false; 346 for (const MachineOperand &MO: MI.operands()) { 347 if (MO.isFI()) { 348 if (SeenFI) 349 llvm_unreachable("should not see multiple frame indices"); 350 351 SeenFI = true; 352 } 353 } 354 #endif 355 356 MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr); 357 assert(FIOp && FIOp->isFI() && "frame index must be address operand"); 358 assert(TII->isMUBUF(MI)); 359 assert(TII->getNamedOperand(MI, AMDGPU::OpName::soffset)->getReg() == 360 MF->getInfo<SIMachineFunctionInfo>()->getFrameOffsetReg() && 361 "should only be seeing frame offset relative FrameIndex"); 362 363 364 MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset); 365 int64_t NewOffset = OffsetOp->getImm() + Offset; 366 assert(isUInt<12>(NewOffset) && "offset should be legal"); 367 368 FIOp->ChangeToRegister(BaseReg, false); 369 OffsetOp->setImm(NewOffset); 370 } 371 372 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, 373 unsigned BaseReg, 374 int64_t Offset) const { 375 if (!SIInstrInfo::isMUBUF(*MI)) 376 return false; 377 378 int64_t NewOffset = Offset + getMUBUFInstrOffset(MI); 379 380 return isUInt<12>(NewOffset); 381 } 382 383 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass( 384 const MachineFunction &MF, unsigned Kind) const { 385 // This is inaccurate. It depends on the instruction and address space. The 386 // only place where we should hit this is for dealing with frame indexes / 387 // private accesses, so this is correct in that case. 388 return &AMDGPU::VGPR_32RegClass; 389 } 390 391 static unsigned getNumSubRegsForSpillOp(unsigned Op) { 392 393 switch (Op) { 394 case AMDGPU::SI_SPILL_S512_SAVE: 395 case AMDGPU::SI_SPILL_S512_RESTORE: 396 case AMDGPU::SI_SPILL_V512_SAVE: 397 case AMDGPU::SI_SPILL_V512_RESTORE: 398 return 16; 399 case AMDGPU::SI_SPILL_S256_SAVE: 400 case AMDGPU::SI_SPILL_S256_RESTORE: 401 case AMDGPU::SI_SPILL_V256_SAVE: 402 case AMDGPU::SI_SPILL_V256_RESTORE: 403 return 8; 404 case AMDGPU::SI_SPILL_S128_SAVE: 405 case AMDGPU::SI_SPILL_S128_RESTORE: 406 case AMDGPU::SI_SPILL_V128_SAVE: 407 case AMDGPU::SI_SPILL_V128_RESTORE: 408 return 4; 409 case AMDGPU::SI_SPILL_V96_SAVE: 410 case AMDGPU::SI_SPILL_V96_RESTORE: 411 return 3; 412 case AMDGPU::SI_SPILL_S64_SAVE: 413 case AMDGPU::SI_SPILL_S64_RESTORE: 414 case AMDGPU::SI_SPILL_V64_SAVE: 415 case AMDGPU::SI_SPILL_V64_RESTORE: 416 return 2; 417 case AMDGPU::SI_SPILL_S32_SAVE: 418 case AMDGPU::SI_SPILL_S32_RESTORE: 419 case AMDGPU::SI_SPILL_V32_SAVE: 420 case AMDGPU::SI_SPILL_V32_RESTORE: 421 return 1; 422 default: llvm_unreachable("Invalid spill opcode"); 423 } 424 } 425 426 static int getOffsetMUBUFStore(unsigned Opc) { 427 switch (Opc) { 428 case AMDGPU::BUFFER_STORE_DWORD_OFFEN: 429 return AMDGPU::BUFFER_STORE_DWORD_OFFSET; 430 case AMDGPU::BUFFER_STORE_BYTE_OFFEN: 431 return AMDGPU::BUFFER_STORE_BYTE_OFFSET; 432 case AMDGPU::BUFFER_STORE_SHORT_OFFEN: 433 return AMDGPU::BUFFER_STORE_SHORT_OFFSET; 434 case AMDGPU::BUFFER_STORE_DWORDX2_OFFEN: 435 return AMDGPU::BUFFER_STORE_DWORDX2_OFFSET; 436 case AMDGPU::BUFFER_STORE_DWORDX4_OFFEN: 437 return AMDGPU::BUFFER_STORE_DWORDX4_OFFSET; 438 case AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFEN: 439 return AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFSET; 440 case AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFEN: 441 return AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFSET; 442 default: 443 return -1; 444 } 445 } 446 447 static int getOffsetMUBUFLoad(unsigned Opc) { 448 switch (Opc) { 449 case AMDGPU::BUFFER_LOAD_DWORD_OFFEN: 450 return AMDGPU::BUFFER_LOAD_DWORD_OFFSET; 451 case AMDGPU::BUFFER_LOAD_UBYTE_OFFEN: 452 return AMDGPU::BUFFER_LOAD_UBYTE_OFFSET; 453 case AMDGPU::BUFFER_LOAD_SBYTE_OFFEN: 454 return AMDGPU::BUFFER_LOAD_SBYTE_OFFSET; 455 case AMDGPU::BUFFER_LOAD_USHORT_OFFEN: 456 return AMDGPU::BUFFER_LOAD_USHORT_OFFSET; 457 case AMDGPU::BUFFER_LOAD_SSHORT_OFFEN: 458 return AMDGPU::BUFFER_LOAD_SSHORT_OFFSET; 459 case AMDGPU::BUFFER_LOAD_DWORDX2_OFFEN: 460 return AMDGPU::BUFFER_LOAD_DWORDX2_OFFSET; 461 case AMDGPU::BUFFER_LOAD_DWORDX4_OFFEN: 462 return AMDGPU::BUFFER_LOAD_DWORDX4_OFFSET; 463 case AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFEN: 464 return AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFSET; 465 case AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFEN: 466 return AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFSET; 467 case AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFEN: 468 return AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFSET; 469 case AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFEN: 470 return AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFSET; 471 case AMDGPU::BUFFER_LOAD_SHORT_D16_OFFEN: 472 return AMDGPU::BUFFER_LOAD_SHORT_D16_OFFSET; 473 case AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFEN: 474 return AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFSET; 475 default: 476 return -1; 477 } 478 } 479 480 // This differs from buildSpillLoadStore by only scavenging a VGPR. It does not 481 // need to handle the case where an SGPR may need to be spilled while spilling. 482 static bool buildMUBUFOffsetLoadStore(const SIInstrInfo *TII, 483 MachineFrameInfo &MFI, 484 MachineBasicBlock::iterator MI, 485 int Index, 486 int64_t Offset) { 487 MachineBasicBlock *MBB = MI->getParent(); 488 const DebugLoc &DL = MI->getDebugLoc(); 489 bool IsStore = MI->mayStore(); 490 491 unsigned Opc = MI->getOpcode(); 492 int LoadStoreOp = IsStore ? 493 getOffsetMUBUFStore(Opc) : getOffsetMUBUFLoad(Opc); 494 if (LoadStoreOp == -1) 495 return false; 496 497 const MachineOperand *Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::vdata); 498 MachineInstrBuilder NewMI = 499 BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp)) 500 .add(*Reg) 501 .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)) 502 .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)) 503 .addImm(Offset) 504 .addImm(0) // glc 505 .addImm(0) // slc 506 .addImm(0) // tfe 507 .cloneMemRefs(*MI); 508 509 const MachineOperand *VDataIn = TII->getNamedOperand(*MI, 510 AMDGPU::OpName::vdata_in); 511 if (VDataIn) 512 NewMI.add(*VDataIn); 513 return true; 514 } 515 516 void SIRegisterInfo::buildSpillLoadStore(MachineBasicBlock::iterator MI, 517 unsigned LoadStoreOp, 518 int Index, 519 unsigned ValueReg, 520 bool IsKill, 521 unsigned ScratchRsrcReg, 522 unsigned ScratchOffsetReg, 523 int64_t InstOffset, 524 MachineMemOperand *MMO, 525 RegScavenger *RS) const { 526 MachineBasicBlock *MBB = MI->getParent(); 527 MachineFunction *MF = MI->getParent()->getParent(); 528 const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>(); 529 const SIInstrInfo *TII = ST.getInstrInfo(); 530 const MachineFrameInfo &MFI = MF->getFrameInfo(); 531 532 const MCInstrDesc &Desc = TII->get(LoadStoreOp); 533 const DebugLoc &DL = MI->getDebugLoc(); 534 bool IsStore = Desc.mayStore(); 535 536 bool Scavenged = false; 537 unsigned SOffset = ScratchOffsetReg; 538 539 const unsigned EltSize = 4; 540 const TargetRegisterClass *RC = getRegClassForReg(MF->getRegInfo(), ValueReg); 541 unsigned NumSubRegs = AMDGPU::getRegBitWidth(RC->getID()) / (EltSize * CHAR_BIT); 542 unsigned Size = NumSubRegs * EltSize; 543 int64_t Offset = InstOffset + MFI.getObjectOffset(Index); 544 int64_t ScratchOffsetRegDelta = 0; 545 546 unsigned Align = MFI.getObjectAlignment(Index); 547 const MachinePointerInfo &BasePtrInfo = MMO->getPointerInfo(); 548 549 assert((Offset % EltSize) == 0 && "unexpected VGPR spill offset"); 550 551 if (!isUInt<12>(Offset + Size - EltSize)) { 552 SOffset = AMDGPU::NoRegister; 553 554 // We currently only support spilling VGPRs to EltSize boundaries, meaning 555 // we can simplify the adjustment of Offset here to just scale with 556 // WavefrontSize. 557 Offset *= ST.getWavefrontSize(); 558 559 // We don't have access to the register scavenger if this function is called 560 // during PEI::scavengeFrameVirtualRegs(). 561 if (RS) 562 SOffset = RS->FindUnusedReg(&AMDGPU::SGPR_32RegClass); 563 564 if (SOffset == AMDGPU::NoRegister) { 565 // There are no free SGPRs, and since we are in the process of spilling 566 // VGPRs too. Since we need a VGPR in order to spill SGPRs (this is true 567 // on SI/CI and on VI it is true until we implement spilling using scalar 568 // stores), we have no way to free up an SGPR. Our solution here is to 569 // add the offset directly to the ScratchOffset register, and then 570 // subtract the offset after the spill to return ScratchOffset to it's 571 // original value. 572 SOffset = ScratchOffsetReg; 573 ScratchOffsetRegDelta = Offset; 574 } else { 575 Scavenged = true; 576 } 577 578 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset) 579 .addReg(ScratchOffsetReg) 580 .addImm(Offset); 581 582 Offset = 0; 583 } 584 585 for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += EltSize) { 586 unsigned SubReg = NumSubRegs == 1 ? 587 ValueReg : getSubReg(ValueReg, getSubRegFromChannel(i)); 588 589 unsigned SOffsetRegState = 0; 590 unsigned SrcDstRegState = getDefRegState(!IsStore); 591 if (i + 1 == e) { 592 SOffsetRegState |= getKillRegState(Scavenged); 593 // The last implicit use carries the "Kill" flag. 594 SrcDstRegState |= getKillRegState(IsKill); 595 } 596 597 MachinePointerInfo PInfo = BasePtrInfo.getWithOffset(EltSize * i); 598 MachineMemOperand *NewMMO 599 = MF->getMachineMemOperand(PInfo, MMO->getFlags(), 600 EltSize, MinAlign(Align, EltSize * i)); 601 602 auto MIB = BuildMI(*MBB, MI, DL, Desc) 603 .addReg(SubReg, getDefRegState(!IsStore) | getKillRegState(IsKill)) 604 .addReg(ScratchRsrcReg) 605 .addReg(SOffset, SOffsetRegState) 606 .addImm(Offset) 607 .addImm(0) // glc 608 .addImm(0) // slc 609 .addImm(0) // tfe 610 .addMemOperand(NewMMO); 611 612 if (NumSubRegs > 1) 613 MIB.addReg(ValueReg, RegState::Implicit | SrcDstRegState); 614 } 615 616 if (ScratchOffsetRegDelta != 0) { 617 // Subtract the offset we added to the ScratchOffset register. 618 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffsetReg) 619 .addReg(ScratchOffsetReg) 620 .addImm(ScratchOffsetRegDelta); 621 } 622 } 623 624 static std::pair<unsigned, unsigned> getSpillEltSize(unsigned SuperRegSize, 625 bool Store) { 626 if (SuperRegSize % 16 == 0) { 627 return { 16, Store ? AMDGPU::S_BUFFER_STORE_DWORDX4_SGPR : 628 AMDGPU::S_BUFFER_LOAD_DWORDX4_SGPR }; 629 } 630 631 if (SuperRegSize % 8 == 0) { 632 return { 8, Store ? AMDGPU::S_BUFFER_STORE_DWORDX2_SGPR : 633 AMDGPU::S_BUFFER_LOAD_DWORDX2_SGPR }; 634 } 635 636 return { 4, Store ? AMDGPU::S_BUFFER_STORE_DWORD_SGPR : 637 AMDGPU::S_BUFFER_LOAD_DWORD_SGPR}; 638 } 639 640 bool SIRegisterInfo::spillSGPR(MachineBasicBlock::iterator MI, 641 int Index, 642 RegScavenger *RS, 643 bool OnlyToVGPR) const { 644 MachineBasicBlock *MBB = MI->getParent(); 645 MachineFunction *MF = MBB->getParent(); 646 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 647 DenseSet<unsigned> SGPRSpillVGPRDefinedSet; 648 649 ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills 650 = MFI->getSGPRToVGPRSpills(Index); 651 bool SpillToVGPR = !VGPRSpills.empty(); 652 if (OnlyToVGPR && !SpillToVGPR) 653 return false; 654 655 MachineRegisterInfo &MRI = MF->getRegInfo(); 656 const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>(); 657 const SIInstrInfo *TII = ST.getInstrInfo(); 658 659 unsigned SuperReg = MI->getOperand(0).getReg(); 660 bool IsKill = MI->getOperand(0).isKill(); 661 const DebugLoc &DL = MI->getDebugLoc(); 662 663 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 664 665 bool SpillToSMEM = spillSGPRToSMEM(); 666 if (SpillToSMEM && OnlyToVGPR) 667 return false; 668 669 assert(SpillToVGPR || (SuperReg != MFI->getStackPtrOffsetReg() && 670 SuperReg != MFI->getFrameOffsetReg() && 671 SuperReg != MFI->getScratchWaveOffsetReg())); 672 673 assert(SuperReg != AMDGPU::M0 && "m0 should never spill"); 674 675 unsigned OffsetReg = AMDGPU::M0; 676 unsigned M0CopyReg = AMDGPU::NoRegister; 677 678 if (SpillToSMEM) { 679 if (RS->isRegUsed(AMDGPU::M0)) { 680 M0CopyReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 681 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), M0CopyReg) 682 .addReg(AMDGPU::M0); 683 } 684 } 685 686 unsigned ScalarStoreOp; 687 unsigned EltSize = 4; 688 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 689 if (SpillToSMEM && isSGPRClass(RC)) { 690 // XXX - if private_element_size is larger than 4 it might be useful to be 691 // able to spill wider vmem spills. 692 std::tie(EltSize, ScalarStoreOp) = 693 getSpillEltSize(getRegSizeInBits(*RC) / 8, true); 694 } 695 696 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 697 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 698 699 // SubReg carries the "Kill" flag when SubReg == SuperReg. 700 unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill); 701 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 702 unsigned SubReg = NumSubRegs == 1 ? 703 SuperReg : getSubReg(SuperReg, SplitParts[i]); 704 705 if (SpillToSMEM) { 706 int64_t FrOffset = FrameInfo.getObjectOffset(Index); 707 708 // The allocated memory size is really the wavefront size * the frame 709 // index size. The widest register class is 64 bytes, so a 4-byte scratch 710 // allocation is enough to spill this in a single stack object. 711 // 712 // FIXME: Frame size/offsets are computed earlier than this, so the extra 713 // space is still unnecessarily allocated. 714 715 unsigned Align = FrameInfo.getObjectAlignment(Index); 716 MachinePointerInfo PtrInfo 717 = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i); 718 MachineMemOperand *MMO 719 = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore, 720 EltSize, MinAlign(Align, EltSize * i)); 721 722 // SMEM instructions only support a single offset, so increment the wave 723 // offset. 724 725 int64_t Offset = (ST.getWavefrontSize() * FrOffset) + (EltSize * i); 726 if (Offset != 0) { 727 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), OffsetReg) 728 .addReg(MFI->getFrameOffsetReg()) 729 .addImm(Offset); 730 } else { 731 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg) 732 .addReg(MFI->getFrameOffsetReg()); 733 } 734 735 BuildMI(*MBB, MI, DL, TII->get(ScalarStoreOp)) 736 .addReg(SubReg, getKillRegState(IsKill)) // sdata 737 .addReg(MFI->getScratchRSrcReg()) // sbase 738 .addReg(OffsetReg, RegState::Kill) // soff 739 .addImm(0) // glc 740 .addMemOperand(MMO); 741 742 continue; 743 } 744 745 if (SpillToVGPR) { 746 SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i]; 747 748 // During SGPR spilling to VGPR, determine if the VGPR is defined. The 749 // only circumstance in which we say it is undefined is when it is the 750 // first spill to this VGPR in the first basic block. 751 bool VGPRDefined = true; 752 if (MBB == &MF->front()) 753 VGPRDefined = !SGPRSpillVGPRDefinedSet.insert(Spill.VGPR).second; 754 755 // Mark the "old value of vgpr" input undef only if this is the first sgpr 756 // spill to this specific vgpr in the first basic block. 757 BuildMI(*MBB, MI, DL, 758 TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32), 759 Spill.VGPR) 760 .addReg(SubReg, getKillRegState(IsKill)) 761 .addImm(Spill.Lane) 762 .addReg(Spill.VGPR, VGPRDefined ? 0 : RegState::Undef); 763 764 // FIXME: Since this spills to another register instead of an actual 765 // frame index, we should delete the frame index when all references to 766 // it are fixed. 767 } else { 768 // XXX - Can to VGPR spill fail for some subregisters but not others? 769 if (OnlyToVGPR) 770 return false; 771 772 // Spill SGPR to a frame index. 773 // TODO: Should VI try to spill to VGPR and then spill to SMEM? 774 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 775 // TODO: Should VI try to spill to VGPR and then spill to SMEM? 776 777 MachineInstrBuilder Mov 778 = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 779 .addReg(SubReg, SubKillState); 780 781 782 // There could be undef components of a spilled super register. 783 // TODO: Can we detect this and skip the spill? 784 if (NumSubRegs > 1) { 785 // The last implicit use of the SuperReg carries the "Kill" flag. 786 unsigned SuperKillState = 0; 787 if (i + 1 == e) 788 SuperKillState |= getKillRegState(IsKill); 789 Mov.addReg(SuperReg, RegState::Implicit | SuperKillState); 790 } 791 792 unsigned Align = FrameInfo.getObjectAlignment(Index); 793 MachinePointerInfo PtrInfo 794 = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i); 795 MachineMemOperand *MMO 796 = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore, 797 EltSize, MinAlign(Align, EltSize * i)); 798 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE)) 799 .addReg(TmpReg, RegState::Kill) // src 800 .addFrameIndex(Index) // vaddr 801 .addReg(MFI->getScratchRSrcReg()) // srrsrc 802 .addReg(MFI->getFrameOffsetReg()) // soffset 803 .addImm(i * 4) // offset 804 .addMemOperand(MMO); 805 } 806 } 807 808 if (M0CopyReg != AMDGPU::NoRegister) { 809 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), AMDGPU::M0) 810 .addReg(M0CopyReg, RegState::Kill); 811 } 812 813 MI->eraseFromParent(); 814 MFI->addToSpilledSGPRs(NumSubRegs); 815 return true; 816 } 817 818 bool SIRegisterInfo::restoreSGPR(MachineBasicBlock::iterator MI, 819 int Index, 820 RegScavenger *RS, 821 bool OnlyToVGPR) const { 822 MachineFunction *MF = MI->getParent()->getParent(); 823 MachineRegisterInfo &MRI = MF->getRegInfo(); 824 MachineBasicBlock *MBB = MI->getParent(); 825 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 826 827 ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills 828 = MFI->getSGPRToVGPRSpills(Index); 829 bool SpillToVGPR = !VGPRSpills.empty(); 830 if (OnlyToVGPR && !SpillToVGPR) 831 return false; 832 833 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 834 const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>(); 835 const SIInstrInfo *TII = ST.getInstrInfo(); 836 const DebugLoc &DL = MI->getDebugLoc(); 837 838 unsigned SuperReg = MI->getOperand(0).getReg(); 839 bool SpillToSMEM = spillSGPRToSMEM(); 840 if (SpillToSMEM && OnlyToVGPR) 841 return false; 842 843 assert(SuperReg != AMDGPU::M0 && "m0 should never spill"); 844 845 unsigned OffsetReg = AMDGPU::M0; 846 unsigned M0CopyReg = AMDGPU::NoRegister; 847 848 if (SpillToSMEM) { 849 if (RS->isRegUsed(AMDGPU::M0)) { 850 M0CopyReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 851 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), M0CopyReg) 852 .addReg(AMDGPU::M0); 853 } 854 } 855 856 unsigned EltSize = 4; 857 unsigned ScalarLoadOp; 858 859 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 860 if (SpillToSMEM && isSGPRClass(RC)) { 861 // XXX - if private_element_size is larger than 4 it might be useful to be 862 // able to spill wider vmem spills. 863 std::tie(EltSize, ScalarLoadOp) = 864 getSpillEltSize(getRegSizeInBits(*RC) / 8, false); 865 } 866 867 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 868 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 869 870 // SubReg carries the "Kill" flag when SubReg == SuperReg. 871 int64_t FrOffset = FrameInfo.getObjectOffset(Index); 872 873 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 874 unsigned SubReg = NumSubRegs == 1 ? 875 SuperReg : getSubReg(SuperReg, SplitParts[i]); 876 877 if (SpillToSMEM) { 878 // FIXME: Size may be > 4 but extra bytes wasted. 879 unsigned Align = FrameInfo.getObjectAlignment(Index); 880 MachinePointerInfo PtrInfo 881 = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i); 882 MachineMemOperand *MMO 883 = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad, 884 EltSize, MinAlign(Align, EltSize * i)); 885 886 // Add i * 4 offset 887 int64_t Offset = (ST.getWavefrontSize() * FrOffset) + (EltSize * i); 888 if (Offset != 0) { 889 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), OffsetReg) 890 .addReg(MFI->getFrameOffsetReg()) 891 .addImm(Offset); 892 } else { 893 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg) 894 .addReg(MFI->getFrameOffsetReg()); 895 } 896 897 auto MIB = 898 BuildMI(*MBB, MI, DL, TII->get(ScalarLoadOp), SubReg) 899 .addReg(MFI->getScratchRSrcReg()) // sbase 900 .addReg(OffsetReg, RegState::Kill) // soff 901 .addImm(0) // glc 902 .addMemOperand(MMO); 903 904 if (NumSubRegs > 1) 905 MIB.addReg(SuperReg, RegState::ImplicitDefine); 906 907 continue; 908 } 909 910 if (SpillToVGPR) { 911 SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i]; 912 auto MIB = 913 BuildMI(*MBB, MI, DL, TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32), 914 SubReg) 915 .addReg(Spill.VGPR) 916 .addImm(Spill.Lane); 917 918 if (NumSubRegs > 1) 919 MIB.addReg(SuperReg, RegState::ImplicitDefine); 920 } else { 921 if (OnlyToVGPR) 922 return false; 923 924 // Restore SGPR from a stack slot. 925 // FIXME: We should use S_LOAD_DWORD here for VI. 926 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 927 unsigned Align = FrameInfo.getObjectAlignment(Index); 928 929 MachinePointerInfo PtrInfo 930 = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i); 931 932 MachineMemOperand *MMO = MF->getMachineMemOperand(PtrInfo, 933 MachineMemOperand::MOLoad, EltSize, 934 MinAlign(Align, EltSize * i)); 935 936 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg) 937 .addFrameIndex(Index) // vaddr 938 .addReg(MFI->getScratchRSrcReg()) // srsrc 939 .addReg(MFI->getFrameOffsetReg()) // soffset 940 .addImm(i * 4) // offset 941 .addMemOperand(MMO); 942 943 auto MIB = 944 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg) 945 .addReg(TmpReg, RegState::Kill); 946 947 if (NumSubRegs > 1) 948 MIB.addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine); 949 } 950 } 951 952 if (M0CopyReg != AMDGPU::NoRegister) { 953 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), AMDGPU::M0) 954 .addReg(M0CopyReg, RegState::Kill); 955 } 956 957 MI->eraseFromParent(); 958 return true; 959 } 960 961 /// Special case of eliminateFrameIndex. Returns true if the SGPR was spilled to 962 /// a VGPR and the stack slot can be safely eliminated when all other users are 963 /// handled. 964 bool SIRegisterInfo::eliminateSGPRToVGPRSpillFrameIndex( 965 MachineBasicBlock::iterator MI, 966 int FI, 967 RegScavenger *RS) const { 968 switch (MI->getOpcode()) { 969 case AMDGPU::SI_SPILL_S512_SAVE: 970 case AMDGPU::SI_SPILL_S256_SAVE: 971 case AMDGPU::SI_SPILL_S128_SAVE: 972 case AMDGPU::SI_SPILL_S64_SAVE: 973 case AMDGPU::SI_SPILL_S32_SAVE: 974 return spillSGPR(MI, FI, RS, true); 975 case AMDGPU::SI_SPILL_S512_RESTORE: 976 case AMDGPU::SI_SPILL_S256_RESTORE: 977 case AMDGPU::SI_SPILL_S128_RESTORE: 978 case AMDGPU::SI_SPILL_S64_RESTORE: 979 case AMDGPU::SI_SPILL_S32_RESTORE: 980 return restoreSGPR(MI, FI, RS, true); 981 default: 982 llvm_unreachable("not an SGPR spill instruction"); 983 } 984 } 985 986 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, 987 int SPAdj, unsigned FIOperandNum, 988 RegScavenger *RS) const { 989 MachineFunction *MF = MI->getParent()->getParent(); 990 MachineRegisterInfo &MRI = MF->getRegInfo(); 991 MachineBasicBlock *MBB = MI->getParent(); 992 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 993 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 994 const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>(); 995 const SIInstrInfo *TII = ST.getInstrInfo(); 996 DebugLoc DL = MI->getDebugLoc(); 997 998 MachineOperand &FIOp = MI->getOperand(FIOperandNum); 999 int Index = MI->getOperand(FIOperandNum).getIndex(); 1000 1001 switch (MI->getOpcode()) { 1002 // SGPR register spill 1003 case AMDGPU::SI_SPILL_S512_SAVE: 1004 case AMDGPU::SI_SPILL_S256_SAVE: 1005 case AMDGPU::SI_SPILL_S128_SAVE: 1006 case AMDGPU::SI_SPILL_S64_SAVE: 1007 case AMDGPU::SI_SPILL_S32_SAVE: { 1008 spillSGPR(MI, Index, RS); 1009 break; 1010 } 1011 1012 // SGPR register restore 1013 case AMDGPU::SI_SPILL_S512_RESTORE: 1014 case AMDGPU::SI_SPILL_S256_RESTORE: 1015 case AMDGPU::SI_SPILL_S128_RESTORE: 1016 case AMDGPU::SI_SPILL_S64_RESTORE: 1017 case AMDGPU::SI_SPILL_S32_RESTORE: { 1018 restoreSGPR(MI, Index, RS); 1019 break; 1020 } 1021 1022 // VGPR register spill 1023 case AMDGPU::SI_SPILL_V512_SAVE: 1024 case AMDGPU::SI_SPILL_V256_SAVE: 1025 case AMDGPU::SI_SPILL_V128_SAVE: 1026 case AMDGPU::SI_SPILL_V96_SAVE: 1027 case AMDGPU::SI_SPILL_V64_SAVE: 1028 case AMDGPU::SI_SPILL_V32_SAVE: { 1029 const MachineOperand *VData = TII->getNamedOperand(*MI, 1030 AMDGPU::OpName::vdata); 1031 buildSpillLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET, 1032 Index, 1033 VData->getReg(), VData->isKill(), 1034 TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(), 1035 TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg(), 1036 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), 1037 *MI->memoperands_begin(), 1038 RS); 1039 MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode())); 1040 MI->eraseFromParent(); 1041 break; 1042 } 1043 case AMDGPU::SI_SPILL_V32_RESTORE: 1044 case AMDGPU::SI_SPILL_V64_RESTORE: 1045 case AMDGPU::SI_SPILL_V96_RESTORE: 1046 case AMDGPU::SI_SPILL_V128_RESTORE: 1047 case AMDGPU::SI_SPILL_V256_RESTORE: 1048 case AMDGPU::SI_SPILL_V512_RESTORE: { 1049 const MachineOperand *VData = TII->getNamedOperand(*MI, 1050 AMDGPU::OpName::vdata); 1051 1052 buildSpillLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET, 1053 Index, 1054 VData->getReg(), VData->isKill(), 1055 TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(), 1056 TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg(), 1057 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), 1058 *MI->memoperands_begin(), 1059 RS); 1060 MI->eraseFromParent(); 1061 break; 1062 } 1063 1064 default: { 1065 const DebugLoc &DL = MI->getDebugLoc(); 1066 bool IsMUBUF = TII->isMUBUF(*MI); 1067 1068 if (!IsMUBUF && 1069 MFI->getFrameOffsetReg() != MFI->getScratchWaveOffsetReg()) { 1070 // Convert to an absolute stack address by finding the offset from the 1071 // scratch wave base and scaling by the wave size. 1072 // 1073 // In an entry function/kernel the stack address is already the 1074 // absolute address relative to the scratch wave offset. 1075 1076 unsigned DiffReg 1077 = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 1078 1079 bool IsCopy = MI->getOpcode() == AMDGPU::V_MOV_B32_e32; 1080 unsigned ResultReg = IsCopy ? 1081 MI->getOperand(0).getReg() : 1082 MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 1083 1084 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), DiffReg) 1085 .addReg(MFI->getFrameOffsetReg()) 1086 .addReg(MFI->getScratchWaveOffsetReg()); 1087 1088 int64_t Offset = FrameInfo.getObjectOffset(Index); 1089 if (Offset == 0) { 1090 // XXX - This never happens because of emergency scavenging slot at 0? 1091 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ResultReg) 1092 .addImm(Log2_32(ST.getWavefrontSize())) 1093 .addReg(DiffReg); 1094 } else { 1095 unsigned ScaledReg 1096 = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 1097 1098 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ScaledReg) 1099 .addImm(Log2_32(ST.getWavefrontSize())) 1100 .addReg(DiffReg, RegState::Kill); 1101 1102 // TODO: Fold if use instruction is another add of a constant. 1103 if (AMDGPU::isInlinableLiteral32(Offset, ST.hasInv2PiInlineImm())) { 1104 TII->getAddNoCarry(*MBB, MI, DL, ResultReg) 1105 .addImm(Offset) 1106 .addReg(ScaledReg, RegState::Kill); 1107 } else { 1108 unsigned ConstOffsetReg 1109 = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 1110 1111 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), ConstOffsetReg) 1112 .addImm(Offset); 1113 TII->getAddNoCarry(*MBB, MI, DL, ResultReg) 1114 .addReg(ConstOffsetReg, RegState::Kill) 1115 .addReg(ScaledReg, RegState::Kill); 1116 } 1117 } 1118 1119 // Don't introduce an extra copy if we're just materializing in a mov. 1120 if (IsCopy) 1121 MI->eraseFromParent(); 1122 else 1123 FIOp.ChangeToRegister(ResultReg, false, false, true); 1124 return; 1125 } 1126 1127 if (IsMUBUF) { 1128 // Disable offen so we don't need a 0 vgpr base. 1129 assert(static_cast<int>(FIOperandNum) == 1130 AMDGPU::getNamedOperandIdx(MI->getOpcode(), 1131 AMDGPU::OpName::vaddr)); 1132 1133 assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() 1134 == MFI->getFrameOffsetReg()); 1135 1136 int64_t Offset = FrameInfo.getObjectOffset(Index); 1137 int64_t OldImm 1138 = TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(); 1139 int64_t NewOffset = OldImm + Offset; 1140 1141 if (isUInt<12>(NewOffset) && 1142 buildMUBUFOffsetLoadStore(TII, FrameInfo, MI, Index, NewOffset)) { 1143 MI->eraseFromParent(); 1144 return; 1145 } 1146 } 1147 1148 // If the offset is simply too big, don't convert to a scratch wave offset 1149 // relative index. 1150 1151 int64_t Offset = FrameInfo.getObjectOffset(Index); 1152 FIOp.ChangeToImmediate(Offset); 1153 if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) { 1154 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 1155 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 1156 .addImm(Offset); 1157 FIOp.ChangeToRegister(TmpReg, false, false, true); 1158 } 1159 } 1160 } 1161 } 1162 1163 StringRef SIRegisterInfo::getRegAsmName(unsigned Reg) const { 1164 #define AMDGPU_REG_ASM_NAMES 1165 #include "AMDGPURegAsmNames.inc.cpp" 1166 1167 #define REG_RANGE(BeginReg, EndReg, RegTable) \ 1168 if (Reg >= BeginReg && Reg <= EndReg) { \ 1169 unsigned Index = Reg - BeginReg; \ 1170 assert(Index < array_lengthof(RegTable)); \ 1171 return RegTable[Index]; \ 1172 } 1173 1174 REG_RANGE(AMDGPU::VGPR0, AMDGPU::VGPR255, VGPR32RegNames); 1175 REG_RANGE(AMDGPU::SGPR0, AMDGPU::SGPR103, SGPR32RegNames); 1176 REG_RANGE(AMDGPU::VGPR0_VGPR1, AMDGPU::VGPR254_VGPR255, VGPR64RegNames); 1177 REG_RANGE(AMDGPU::SGPR0_SGPR1, AMDGPU::SGPR102_SGPR103, SGPR64RegNames); 1178 REG_RANGE(AMDGPU::VGPR0_VGPR1_VGPR2, AMDGPU::VGPR253_VGPR254_VGPR255, 1179 VGPR96RegNames); 1180 1181 REG_RANGE(AMDGPU::VGPR0_VGPR1_VGPR2_VGPR3, 1182 AMDGPU::VGPR252_VGPR253_VGPR254_VGPR255, 1183 VGPR128RegNames); 1184 REG_RANGE(AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3, 1185 AMDGPU::SGPR100_SGPR101_SGPR102_SGPR103, 1186 SGPR128RegNames); 1187 1188 REG_RANGE(AMDGPU::VGPR0_VGPR1_VGPR2_VGPR3_VGPR4_VGPR5_VGPR6_VGPR7, 1189 AMDGPU::VGPR248_VGPR249_VGPR250_VGPR251_VGPR252_VGPR253_VGPR254_VGPR255, 1190 VGPR256RegNames); 1191 1192 REG_RANGE( 1193 AMDGPU::VGPR0_VGPR1_VGPR2_VGPR3_VGPR4_VGPR5_VGPR6_VGPR7_VGPR8_VGPR9_VGPR10_VGPR11_VGPR12_VGPR13_VGPR14_VGPR15, 1194 AMDGPU::VGPR240_VGPR241_VGPR242_VGPR243_VGPR244_VGPR245_VGPR246_VGPR247_VGPR248_VGPR249_VGPR250_VGPR251_VGPR252_VGPR253_VGPR254_VGPR255, 1195 VGPR512RegNames); 1196 1197 REG_RANGE(AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3_SGPR4_SGPR5_SGPR6_SGPR7, 1198 AMDGPU::SGPR96_SGPR97_SGPR98_SGPR99_SGPR100_SGPR101_SGPR102_SGPR103, 1199 SGPR256RegNames); 1200 1201 REG_RANGE( 1202 AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3_SGPR4_SGPR5_SGPR6_SGPR7_SGPR8_SGPR9_SGPR10_SGPR11_SGPR12_SGPR13_SGPR14_SGPR15, 1203 AMDGPU::SGPR88_SGPR89_SGPR90_SGPR91_SGPR92_SGPR93_SGPR94_SGPR95_SGPR96_SGPR97_SGPR98_SGPR99_SGPR100_SGPR101_SGPR102_SGPR103, 1204 SGPR512RegNames 1205 ); 1206 1207 #undef REG_RANGE 1208 1209 // FIXME: Rename flat_scr so we don't need to special case this. 1210 switch (Reg) { 1211 case AMDGPU::FLAT_SCR: 1212 return "flat_scratch"; 1213 case AMDGPU::FLAT_SCR_LO: 1214 return "flat_scratch_lo"; 1215 case AMDGPU::FLAT_SCR_HI: 1216 return "flat_scratch_hi"; 1217 default: 1218 // For the special named registers the default is fine. 1219 return TargetRegisterInfo::getRegAsmName(Reg); 1220 } 1221 } 1222 1223 // FIXME: This is very slow. It might be worth creating a map from physreg to 1224 // register class. 1225 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const { 1226 assert(!TargetRegisterInfo::isVirtualRegister(Reg)); 1227 1228 static const TargetRegisterClass *const BaseClasses[] = { 1229 &AMDGPU::VGPR_32RegClass, 1230 &AMDGPU::SReg_32RegClass, 1231 &AMDGPU::VReg_64RegClass, 1232 &AMDGPU::SReg_64RegClass, 1233 &AMDGPU::VReg_96RegClass, 1234 &AMDGPU::VReg_128RegClass, 1235 &AMDGPU::SReg_128RegClass, 1236 &AMDGPU::VReg_256RegClass, 1237 &AMDGPU::SReg_256RegClass, 1238 &AMDGPU::VReg_512RegClass, 1239 &AMDGPU::SReg_512RegClass, 1240 &AMDGPU::SCC_CLASSRegClass, 1241 &AMDGPU::Pseudo_SReg_32RegClass, 1242 &AMDGPU::Pseudo_SReg_128RegClass, 1243 }; 1244 1245 for (const TargetRegisterClass *BaseClass : BaseClasses) { 1246 if (BaseClass->contains(Reg)) { 1247 return BaseClass; 1248 } 1249 } 1250 return nullptr; 1251 } 1252 1253 // TODO: It might be helpful to have some target specific flags in 1254 // TargetRegisterClass to mark which classes are VGPRs to make this trivial. 1255 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const { 1256 unsigned Size = getRegSizeInBits(*RC); 1257 if (Size < 32) 1258 return false; 1259 switch (Size) { 1260 case 32: 1261 return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr; 1262 case 64: 1263 return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr; 1264 case 96: 1265 return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr; 1266 case 128: 1267 return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr; 1268 case 256: 1269 return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr; 1270 case 512: 1271 return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr; 1272 default: 1273 llvm_unreachable("Invalid register class size"); 1274 } 1275 } 1276 1277 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass( 1278 const TargetRegisterClass *SRC) const { 1279 switch (getRegSizeInBits(*SRC)) { 1280 case 32: 1281 return &AMDGPU::VGPR_32RegClass; 1282 case 64: 1283 return &AMDGPU::VReg_64RegClass; 1284 case 96: 1285 return &AMDGPU::VReg_96RegClass; 1286 case 128: 1287 return &AMDGPU::VReg_128RegClass; 1288 case 256: 1289 return &AMDGPU::VReg_256RegClass; 1290 case 512: 1291 return &AMDGPU::VReg_512RegClass; 1292 default: 1293 llvm_unreachable("Invalid register class size"); 1294 } 1295 } 1296 1297 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass( 1298 const TargetRegisterClass *VRC) const { 1299 switch (getRegSizeInBits(*VRC)) { 1300 case 32: 1301 return &AMDGPU::SGPR_32RegClass; 1302 case 64: 1303 return &AMDGPU::SReg_64RegClass; 1304 case 128: 1305 return &AMDGPU::SReg_128RegClass; 1306 case 256: 1307 return &AMDGPU::SReg_256RegClass; 1308 case 512: 1309 return &AMDGPU::SReg_512RegClass; 1310 default: 1311 llvm_unreachable("Invalid register class size"); 1312 } 1313 } 1314 1315 const TargetRegisterClass *SIRegisterInfo::getSubRegClass( 1316 const TargetRegisterClass *RC, unsigned SubIdx) const { 1317 if (SubIdx == AMDGPU::NoSubRegister) 1318 return RC; 1319 1320 // We can assume that each lane corresponds to one 32-bit register. 1321 unsigned Count = getSubRegIndexLaneMask(SubIdx).getNumLanes(); 1322 if (isSGPRClass(RC)) { 1323 switch (Count) { 1324 case 1: 1325 return &AMDGPU::SGPR_32RegClass; 1326 case 2: 1327 return &AMDGPU::SReg_64RegClass; 1328 case 4: 1329 return &AMDGPU::SReg_128RegClass; 1330 case 8: 1331 return &AMDGPU::SReg_256RegClass; 1332 case 16: /* fall-through */ 1333 default: 1334 llvm_unreachable("Invalid sub-register class size"); 1335 } 1336 } else { 1337 switch (Count) { 1338 case 1: 1339 return &AMDGPU::VGPR_32RegClass; 1340 case 2: 1341 return &AMDGPU::VReg_64RegClass; 1342 case 3: 1343 return &AMDGPU::VReg_96RegClass; 1344 case 4: 1345 return &AMDGPU::VReg_128RegClass; 1346 case 8: 1347 return &AMDGPU::VReg_256RegClass; 1348 case 16: /* fall-through */ 1349 default: 1350 llvm_unreachable("Invalid sub-register class size"); 1351 } 1352 } 1353 } 1354 1355 bool SIRegisterInfo::shouldRewriteCopySrc( 1356 const TargetRegisterClass *DefRC, 1357 unsigned DefSubReg, 1358 const TargetRegisterClass *SrcRC, 1359 unsigned SrcSubReg) const { 1360 // We want to prefer the smallest register class possible, so we don't want to 1361 // stop and rewrite on anything that looks like a subregister 1362 // extract. Operations mostly don't care about the super register class, so we 1363 // only want to stop on the most basic of copies between the same register 1364 // class. 1365 // 1366 // e.g. if we have something like 1367 // %0 = ... 1368 // %1 = ... 1369 // %2 = REG_SEQUENCE %0, sub0, %1, sub1, %2, sub2 1370 // %3 = COPY %2, sub0 1371 // 1372 // We want to look through the COPY to find: 1373 // => %3 = COPY %0 1374 1375 // Plain copy. 1376 return getCommonSubClass(DefRC, SrcRC) != nullptr; 1377 } 1378 1379 /// Returns a register that is not used at any point in the function. 1380 /// If all registers are used, then this function will return 1381 // AMDGPU::NoRegister. 1382 unsigned 1383 SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI, 1384 const TargetRegisterClass *RC, 1385 const MachineFunction &MF) const { 1386 1387 for (unsigned Reg : *RC) 1388 if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg)) 1389 return Reg; 1390 return AMDGPU::NoRegister; 1391 } 1392 1393 ArrayRef<int16_t> SIRegisterInfo::getRegSplitParts(const TargetRegisterClass *RC, 1394 unsigned EltSize) const { 1395 if (EltSize == 4) { 1396 static const int16_t Sub0_15[] = { 1397 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1398 AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7, 1399 AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11, 1400 AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15, 1401 }; 1402 1403 static const int16_t Sub0_7[] = { 1404 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1405 AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7, 1406 }; 1407 1408 static const int16_t Sub0_3[] = { 1409 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1410 }; 1411 1412 static const int16_t Sub0_2[] = { 1413 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, 1414 }; 1415 1416 static const int16_t Sub0_1[] = { 1417 AMDGPU::sub0, AMDGPU::sub1, 1418 }; 1419 1420 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1421 case 32: 1422 return {}; 1423 case 64: 1424 return makeArrayRef(Sub0_1); 1425 case 96: 1426 return makeArrayRef(Sub0_2); 1427 case 128: 1428 return makeArrayRef(Sub0_3); 1429 case 256: 1430 return makeArrayRef(Sub0_7); 1431 case 512: 1432 return makeArrayRef(Sub0_15); 1433 default: 1434 llvm_unreachable("unhandled register size"); 1435 } 1436 } 1437 1438 if (EltSize == 8) { 1439 static const int16_t Sub0_15_64[] = { 1440 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3, 1441 AMDGPU::sub4_sub5, AMDGPU::sub6_sub7, 1442 AMDGPU::sub8_sub9, AMDGPU::sub10_sub11, 1443 AMDGPU::sub12_sub13, AMDGPU::sub14_sub15 1444 }; 1445 1446 static const int16_t Sub0_7_64[] = { 1447 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3, 1448 AMDGPU::sub4_sub5, AMDGPU::sub6_sub7 1449 }; 1450 1451 1452 static const int16_t Sub0_3_64[] = { 1453 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3 1454 }; 1455 1456 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1457 case 64: 1458 return {}; 1459 case 128: 1460 return makeArrayRef(Sub0_3_64); 1461 case 256: 1462 return makeArrayRef(Sub0_7_64); 1463 case 512: 1464 return makeArrayRef(Sub0_15_64); 1465 default: 1466 llvm_unreachable("unhandled register size"); 1467 } 1468 } 1469 1470 assert(EltSize == 16 && "unhandled register spill split size"); 1471 1472 static const int16_t Sub0_15_128[] = { 1473 AMDGPU::sub0_sub1_sub2_sub3, 1474 AMDGPU::sub4_sub5_sub6_sub7, 1475 AMDGPU::sub8_sub9_sub10_sub11, 1476 AMDGPU::sub12_sub13_sub14_sub15 1477 }; 1478 1479 static const int16_t Sub0_7_128[] = { 1480 AMDGPU::sub0_sub1_sub2_sub3, 1481 AMDGPU::sub4_sub5_sub6_sub7 1482 }; 1483 1484 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1485 case 128: 1486 return {}; 1487 case 256: 1488 return makeArrayRef(Sub0_7_128); 1489 case 512: 1490 return makeArrayRef(Sub0_15_128); 1491 default: 1492 llvm_unreachable("unhandled register size"); 1493 } 1494 } 1495 1496 const TargetRegisterClass* 1497 SIRegisterInfo::getRegClassForReg(const MachineRegisterInfo &MRI, 1498 unsigned Reg) const { 1499 if (TargetRegisterInfo::isVirtualRegister(Reg)) 1500 return MRI.getRegClass(Reg); 1501 1502 return getPhysRegClass(Reg); 1503 } 1504 1505 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI, 1506 unsigned Reg) const { 1507 const TargetRegisterClass * RC = getRegClassForReg(MRI, Reg); 1508 assert(RC && "Register class for the reg not found"); 1509 return hasVGPRs(RC); 1510 } 1511 1512 bool SIRegisterInfo::shouldCoalesce(MachineInstr *MI, 1513 const TargetRegisterClass *SrcRC, 1514 unsigned SubReg, 1515 const TargetRegisterClass *DstRC, 1516 unsigned DstSubReg, 1517 const TargetRegisterClass *NewRC, 1518 LiveIntervals &LIS) const { 1519 unsigned SrcSize = getRegSizeInBits(*SrcRC); 1520 unsigned DstSize = getRegSizeInBits(*DstRC); 1521 unsigned NewSize = getRegSizeInBits(*NewRC); 1522 1523 // Do not increase size of registers beyond dword, we would need to allocate 1524 // adjacent registers and constraint regalloc more than needed. 1525 1526 // Always allow dword coalescing. 1527 if (SrcSize <= 32 || DstSize <= 32) 1528 return true; 1529 1530 return NewSize <= DstSize || NewSize <= SrcSize; 1531 } 1532 1533 unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, 1534 MachineFunction &MF) const { 1535 1536 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1537 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 1538 1539 unsigned Occupancy = ST.getOccupancyWithLocalMemSize(MFI->getLDSSize(), 1540 MF.getFunction()); 1541 switch (RC->getID()) { 1542 default: 1543 return AMDGPURegisterInfo::getRegPressureLimit(RC, MF); 1544 case AMDGPU::VGPR_32RegClassID: 1545 return std::min(ST.getMaxNumVGPRs(Occupancy), ST.getMaxNumVGPRs(MF)); 1546 case AMDGPU::SGPR_32RegClassID: 1547 return std::min(ST.getMaxNumSGPRs(Occupancy, true), ST.getMaxNumSGPRs(MF)); 1548 } 1549 } 1550 1551 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF, 1552 unsigned Idx) const { 1553 if (Idx == getVGPRPressureSet()) 1554 return getRegPressureLimit(&AMDGPU::VGPR_32RegClass, 1555 const_cast<MachineFunction &>(MF)); 1556 1557 if (Idx == getSGPRPressureSet()) 1558 return getRegPressureLimit(&AMDGPU::SGPR_32RegClass, 1559 const_cast<MachineFunction &>(MF)); 1560 1561 return AMDGPURegisterInfo::getRegPressureSetLimit(MF, Idx); 1562 } 1563 1564 const int *SIRegisterInfo::getRegUnitPressureSets(unsigned RegUnit) const { 1565 static const int Empty[] = { -1 }; 1566 1567 if (hasRegUnit(AMDGPU::M0, RegUnit)) 1568 return Empty; 1569 return AMDGPURegisterInfo::getRegUnitPressureSets(RegUnit); 1570 } 1571 1572 unsigned SIRegisterInfo::getReturnAddressReg(const MachineFunction &MF) const { 1573 // Not a callee saved register. 1574 return AMDGPU::SGPR30_SGPR31; 1575 } 1576 1577 const TargetRegisterClass * 1578 SIRegisterInfo::getConstrainedRegClassForOperand(const MachineOperand &MO, 1579 const MachineRegisterInfo &MRI) const { 1580 unsigned Size = getRegSizeInBits(MO.getReg(), MRI); 1581 const RegisterBank *RB = MRI.getRegBankOrNull(MO.getReg()); 1582 if (!RB) 1583 return nullptr; 1584 1585 switch (Size) { 1586 case 32: 1587 return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VGPR_32RegClass : 1588 &AMDGPU::SReg_32_XM0RegClass; 1589 case 64: 1590 return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_64RegClass : 1591 &AMDGPU::SReg_64_XEXECRegClass; 1592 case 96: 1593 return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_96RegClass : 1594 nullptr; 1595 case 128: 1596 return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_128RegClass : 1597 &AMDGPU::SReg_128RegClass; 1598 default: 1599 llvm_unreachable("not implemented"); 1600 } 1601 } 1602