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