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