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