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