1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// \file 10 /// SI implementation of the TargetRegisterInfo class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "SIRegisterInfo.h" 15 #include "AMDGPU.h" 16 #include "AMDGPURegisterBankInfo.h" 17 #include "GCNSubtarget.h" 18 #include "MCTargetDesc/AMDGPUInstPrinter.h" 19 #include "MCTargetDesc/AMDGPUMCTargetDesc.h" 20 #include "SIMachineFunctionInfo.h" 21 #include "llvm/CodeGen/LiveIntervals.h" 22 #include "llvm/CodeGen/MachineDominators.h" 23 #include "llvm/CodeGen/RegisterScavenging.h" 24 25 using namespace llvm; 26 27 #define GET_REGINFO_TARGET_DESC 28 #include "AMDGPUGenRegisterInfo.inc" 29 30 static cl::opt<bool> EnableSpillSGPRToVGPR( 31 "amdgpu-spill-sgpr-to-vgpr", 32 cl::desc("Enable spilling VGPRs to SGPRs"), 33 cl::ReallyHidden, 34 cl::init(true)); 35 36 std::array<std::vector<int16_t>, 16> SIRegisterInfo::RegSplitParts; 37 std::array<std::array<uint16_t, 32>, 9> SIRegisterInfo::SubRegFromChannelTable; 38 39 // Map numbers of DWORDs to indexes in SubRegFromChannelTable. 40 // Valid indexes are shifted 1, such that a 0 mapping means unsupported. 41 // e.g. for 8 DWORDs (256-bit), SubRegFromChannelTableWidthMap[8] = 8, 42 // meaning index 7 in SubRegFromChannelTable. 43 static const std::array<unsigned, 17> SubRegFromChannelTableWidthMap = { 44 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9}; 45 46 SIRegisterInfo::SIRegisterInfo(const GCNSubtarget &ST) 47 : AMDGPUGenRegisterInfo(AMDGPU::PC_REG, ST.getAMDGPUDwarfFlavour()), ST(ST), 48 SpillSGPRToVGPR(EnableSpillSGPRToVGPR), isWave32(ST.isWave32()) { 49 50 assert(getSubRegIndexLaneMask(AMDGPU::sub0).getAsInteger() == 3 && 51 getSubRegIndexLaneMask(AMDGPU::sub31).getAsInteger() == (3ULL << 62) && 52 (getSubRegIndexLaneMask(AMDGPU::lo16) | 53 getSubRegIndexLaneMask(AMDGPU::hi16)).getAsInteger() == 54 getSubRegIndexLaneMask(AMDGPU::sub0).getAsInteger() && 55 "getNumCoveredRegs() will not work with generated subreg masks!"); 56 57 RegPressureIgnoredUnits.resize(getNumRegUnits()); 58 RegPressureIgnoredUnits.set( 59 *MCRegUnitIterator(MCRegister::from(AMDGPU::M0), this)); 60 for (auto Reg : AMDGPU::VGPR_HI16RegClass) 61 RegPressureIgnoredUnits.set(*MCRegUnitIterator(Reg, this)); 62 63 // HACK: Until this is fully tablegen'd. 64 static llvm::once_flag InitializeRegSplitPartsFlag; 65 66 static auto InitializeRegSplitPartsOnce = [this]() { 67 for (unsigned Idx = 1, E = getNumSubRegIndices() - 1; Idx < E; ++Idx) { 68 unsigned Size = getSubRegIdxSize(Idx); 69 if (Size & 31) 70 continue; 71 std::vector<int16_t> &Vec = RegSplitParts[Size / 32 - 1]; 72 unsigned Pos = getSubRegIdxOffset(Idx); 73 if (Pos % Size) 74 continue; 75 Pos /= Size; 76 if (Vec.empty()) { 77 unsigned MaxNumParts = 1024 / Size; // Maximum register is 1024 bits. 78 Vec.resize(MaxNumParts); 79 } 80 Vec[Pos] = Idx; 81 } 82 }; 83 84 static llvm::once_flag InitializeSubRegFromChannelTableFlag; 85 86 static auto InitializeSubRegFromChannelTableOnce = [this]() { 87 for (auto &Row : SubRegFromChannelTable) 88 Row.fill(AMDGPU::NoSubRegister); 89 for (uint16_t Idx = 1; Idx < getNumSubRegIndices(); ++Idx) { 90 unsigned Width = AMDGPUSubRegIdxRanges[Idx].Size / 32; 91 unsigned Offset = AMDGPUSubRegIdxRanges[Idx].Offset / 32; 92 assert(Width < SubRegFromChannelTableWidthMap.size()); 93 Width = SubRegFromChannelTableWidthMap[Width]; 94 if (Width == 0) 95 continue; 96 unsigned TableIdx = Width - 1; 97 assert(TableIdx < SubRegFromChannelTable.size()); 98 assert(Offset < SubRegFromChannelTable[TableIdx].size()); 99 SubRegFromChannelTable[TableIdx][Offset] = Idx; 100 } 101 }; 102 103 llvm::call_once(InitializeRegSplitPartsFlag, InitializeRegSplitPartsOnce); 104 llvm::call_once(InitializeSubRegFromChannelTableFlag, 105 InitializeSubRegFromChannelTableOnce); 106 } 107 108 void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, 109 MCRegister Reg) const { 110 MCRegAliasIterator R(Reg, this, true); 111 112 for (; R.isValid(); ++R) 113 Reserved.set(*R); 114 } 115 116 // Forced to be here by one .inc 117 const MCPhysReg *SIRegisterInfo::getCalleeSavedRegs( 118 const MachineFunction *MF) const { 119 CallingConv::ID CC = MF->getFunction().getCallingConv(); 120 switch (CC) { 121 case CallingConv::C: 122 case CallingConv::Fast: 123 case CallingConv::Cold: 124 case CallingConv::AMDGPU_Gfx: 125 return MF->getSubtarget<GCNSubtarget>().hasGFX90AInsts() 126 ? CSR_AMDGPU_HighRegs_With_AGPRs_SaveList 127 : CSR_AMDGPU_HighRegs_SaveList; 128 default: { 129 // Dummy to not crash RegisterClassInfo. 130 static const MCPhysReg NoCalleeSavedReg = AMDGPU::NoRegister; 131 return &NoCalleeSavedReg; 132 } 133 } 134 } 135 136 const MCPhysReg * 137 SIRegisterInfo::getCalleeSavedRegsViaCopy(const MachineFunction *MF) const { 138 return nullptr; 139 } 140 141 const uint32_t *SIRegisterInfo::getCallPreservedMask(const MachineFunction &MF, 142 CallingConv::ID CC) const { 143 switch (CC) { 144 case CallingConv::C: 145 case CallingConv::Fast: 146 case CallingConv::Cold: 147 case CallingConv::AMDGPU_Gfx: 148 return MF.getSubtarget<GCNSubtarget>().hasGFX90AInsts() 149 ? CSR_AMDGPU_HighRegs_With_AGPRs_RegMask 150 : CSR_AMDGPU_HighRegs_RegMask; 151 default: 152 return nullptr; 153 } 154 } 155 156 const uint32_t *SIRegisterInfo::getNoPreservedMask() const { 157 return CSR_AMDGPU_NoRegs_RegMask; 158 } 159 160 Register SIRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 161 const SIFrameLowering *TFI = 162 MF.getSubtarget<GCNSubtarget>().getFrameLowering(); 163 const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>(); 164 // During ISel lowering we always reserve the stack pointer in entry 165 // functions, but never actually want to reference it when accessing our own 166 // frame. If we need a frame pointer we use it, but otherwise we can just use 167 // an immediate "0" which we represent by returning NoRegister. 168 if (FuncInfo->isEntryFunction()) { 169 return TFI->hasFP(MF) ? FuncInfo->getFrameOffsetReg() : Register(); 170 } 171 return TFI->hasFP(MF) ? FuncInfo->getFrameOffsetReg() 172 : FuncInfo->getStackPtrOffsetReg(); 173 } 174 175 bool SIRegisterInfo::hasBasePointer(const MachineFunction &MF) const { 176 // When we need stack realignment, we can't reference off of the 177 // stack pointer, so we reserve a base pointer. 178 const MachineFrameInfo &MFI = MF.getFrameInfo(); 179 return MFI.getNumFixedObjects() && shouldRealignStack(MF); 180 } 181 182 Register SIRegisterInfo::getBaseRegister() const { return AMDGPU::SGPR34; } 183 184 const uint32_t *SIRegisterInfo::getAllVGPRRegMask() const { 185 return CSR_AMDGPU_AllVGPRs_RegMask; 186 } 187 188 const uint32_t *SIRegisterInfo::getAllAGPRRegMask() const { 189 return CSR_AMDGPU_AllAGPRs_RegMask; 190 } 191 192 const uint32_t *SIRegisterInfo::getAllVectorRegMask() const { 193 return CSR_AMDGPU_AllVectorRegs_RegMask; 194 } 195 196 const uint32_t *SIRegisterInfo::getAllAllocatableSRegMask() const { 197 return CSR_AMDGPU_AllAllocatableSRegs_RegMask; 198 } 199 200 unsigned SIRegisterInfo::getSubRegFromChannel(unsigned Channel, 201 unsigned NumRegs) { 202 assert(NumRegs < SubRegFromChannelTableWidthMap.size()); 203 unsigned NumRegIndex = SubRegFromChannelTableWidthMap[NumRegs]; 204 assert(NumRegIndex && "Not implemented"); 205 assert(Channel < SubRegFromChannelTable[NumRegIndex - 1].size()); 206 return SubRegFromChannelTable[NumRegIndex - 1][Channel]; 207 } 208 209 MCRegister SIRegisterInfo::reservedPrivateSegmentBufferReg( 210 const MachineFunction &MF) const { 211 unsigned BaseIdx = alignDown(ST.getMaxNumSGPRs(MF), 4) - 4; 212 MCRegister BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx)); 213 return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SGPR_128RegClass); 214 } 215 216 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 217 BitVector Reserved(getNumRegs()); 218 Reserved.set(AMDGPU::MODE); 219 220 // EXEC_LO and EXEC_HI could be allocated and used as regular register, but 221 // this seems likely to result in bugs, so I'm marking them as reserved. 222 reserveRegisterTuples(Reserved, AMDGPU::EXEC); 223 reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR); 224 225 // M0 has to be reserved so that llvm accepts it as a live-in into a block. 226 reserveRegisterTuples(Reserved, AMDGPU::M0); 227 228 // Reserve src_vccz, src_execz, src_scc. 229 reserveRegisterTuples(Reserved, AMDGPU::SRC_VCCZ); 230 reserveRegisterTuples(Reserved, AMDGPU::SRC_EXECZ); 231 reserveRegisterTuples(Reserved, AMDGPU::SRC_SCC); 232 233 // Reserve the memory aperture registers. 234 reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_BASE); 235 reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_LIMIT); 236 reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_BASE); 237 reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_LIMIT); 238 239 // Reserve src_pops_exiting_wave_id - support is not implemented in Codegen. 240 reserveRegisterTuples(Reserved, AMDGPU::SRC_POPS_EXITING_WAVE_ID); 241 242 // Reserve xnack_mask registers - support is not implemented in Codegen. 243 reserveRegisterTuples(Reserved, AMDGPU::XNACK_MASK); 244 245 // Reserve lds_direct register - support is not implemented in Codegen. 246 reserveRegisterTuples(Reserved, AMDGPU::LDS_DIRECT); 247 248 // Reserve Trap Handler registers - support is not implemented in Codegen. 249 reserveRegisterTuples(Reserved, AMDGPU::TBA); 250 reserveRegisterTuples(Reserved, AMDGPU::TMA); 251 reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1); 252 reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3); 253 reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5); 254 reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7); 255 reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9); 256 reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11); 257 reserveRegisterTuples(Reserved, AMDGPU::TTMP12_TTMP13); 258 reserveRegisterTuples(Reserved, AMDGPU::TTMP14_TTMP15); 259 260 // Reserve null register - it shall never be allocated 261 reserveRegisterTuples(Reserved, AMDGPU::SGPR_NULL); 262 263 // Disallow vcc_hi allocation in wave32. It may be allocated but most likely 264 // will result in bugs. 265 if (isWave32) { 266 Reserved.set(AMDGPU::VCC); 267 Reserved.set(AMDGPU::VCC_HI); 268 } 269 270 unsigned MaxNumSGPRs = ST.getMaxNumSGPRs(MF); 271 unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs(); 272 for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) { 273 unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i); 274 reserveRegisterTuples(Reserved, Reg); 275 } 276 277 unsigned MaxNumVGPRs = ST.getMaxNumVGPRs(MF); 278 // TODO: In an entry function without calls and AGPRs used it is possible 279 // to use the whole register budget for VGPRs. Even more it shall 280 // be possible to estimate maximum AGPR/VGPR pressure and split 281 // register file accordingly. 282 if (ST.hasGFX90AInsts()) 283 MaxNumVGPRs /= 2; 284 unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs(); 285 for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) { 286 unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i); 287 reserveRegisterTuples(Reserved, Reg); 288 Reg = AMDGPU::AGPR_32RegClass.getRegister(i); 289 reserveRegisterTuples(Reserved, Reg); 290 } 291 292 for (auto Reg : AMDGPU::SReg_32RegClass) { 293 Reserved.set(getSubReg(Reg, AMDGPU::hi16)); 294 Register Low = getSubReg(Reg, AMDGPU::lo16); 295 // This is to prevent BB vcc liveness errors. 296 if (!AMDGPU::SGPR_LO16RegClass.contains(Low)) 297 Reserved.set(Low); 298 } 299 300 for (auto Reg : AMDGPU::AGPR_32RegClass) { 301 Reserved.set(getSubReg(Reg, AMDGPU::hi16)); 302 } 303 304 // Reserve all the rest AGPRs if there are no instructions to use it. 305 if (!ST.hasMAIInsts()) { 306 for (unsigned i = 0; i < MaxNumVGPRs; ++i) { 307 unsigned Reg = AMDGPU::AGPR_32RegClass.getRegister(i); 308 reserveRegisterTuples(Reserved, Reg); 309 } 310 } 311 312 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 313 314 Register ScratchRSrcReg = MFI->getScratchRSrcReg(); 315 if (ScratchRSrcReg != AMDGPU::NoRegister) { 316 // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need 317 // to spill. 318 // TODO: May need to reserve a VGPR if doing LDS spilling. 319 reserveRegisterTuples(Reserved, ScratchRSrcReg); 320 } 321 322 // We have to assume the SP is needed in case there are calls in the function, 323 // which is detected after the function is lowered. If we aren't really going 324 // to need SP, don't bother reserving it. 325 MCRegister StackPtrReg = MFI->getStackPtrOffsetReg(); 326 327 if (StackPtrReg) { 328 reserveRegisterTuples(Reserved, StackPtrReg); 329 assert(!isSubRegister(ScratchRSrcReg, StackPtrReg)); 330 } 331 332 MCRegister FrameReg = MFI->getFrameOffsetReg(); 333 if (FrameReg) { 334 reserveRegisterTuples(Reserved, FrameReg); 335 assert(!isSubRegister(ScratchRSrcReg, FrameReg)); 336 } 337 338 if (hasBasePointer(MF)) { 339 MCRegister BasePtrReg = getBaseRegister(); 340 reserveRegisterTuples(Reserved, BasePtrReg); 341 assert(!isSubRegister(ScratchRSrcReg, BasePtrReg)); 342 } 343 344 for (MCRegister Reg : MFI->WWMReservedRegs) { 345 reserveRegisterTuples(Reserved, Reg); 346 } 347 348 // FIXME: Stop using reserved registers for this. 349 for (MCPhysReg Reg : MFI->getAGPRSpillVGPRs()) 350 reserveRegisterTuples(Reserved, Reg); 351 352 for (MCPhysReg Reg : MFI->getVGPRSpillAGPRs()) 353 reserveRegisterTuples(Reserved, Reg); 354 355 for (auto SSpill : MFI->getSGPRSpillVGPRs()) 356 reserveRegisterTuples(Reserved, SSpill.VGPR); 357 358 return Reserved; 359 } 360 361 bool SIRegisterInfo::shouldRealignStack(const MachineFunction &MF) const { 362 const SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>(); 363 // On entry, the base address is 0, so it can't possibly need any more 364 // alignment. 365 366 // FIXME: Should be able to specify the entry frame alignment per calling 367 // convention instead. 368 if (Info->isEntryFunction()) 369 return false; 370 371 return TargetRegisterInfo::shouldRealignStack(MF); 372 } 373 374 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const { 375 const SIMachineFunctionInfo *Info = Fn.getInfo<SIMachineFunctionInfo>(); 376 if (Info->isEntryFunction()) { 377 const MachineFrameInfo &MFI = Fn.getFrameInfo(); 378 return MFI.hasStackObjects() || MFI.hasCalls(); 379 } 380 381 // May need scavenger for dealing with callee saved registers. 382 return true; 383 } 384 385 bool SIRegisterInfo::requiresFrameIndexScavenging( 386 const MachineFunction &MF) const { 387 // Do not use frame virtual registers. They used to be used for SGPRs, but 388 // once we reach PrologEpilogInserter, we can no longer spill SGPRs. If the 389 // scavenger fails, we can increment/decrement the necessary SGPRs to avoid a 390 // spill. 391 return false; 392 } 393 394 bool SIRegisterInfo::requiresFrameIndexReplacementScavenging( 395 const MachineFunction &MF) const { 396 const MachineFrameInfo &MFI = MF.getFrameInfo(); 397 return MFI.hasStackObjects(); 398 } 399 400 bool SIRegisterInfo::requiresVirtualBaseRegisters( 401 const MachineFunction &) const { 402 // There are no special dedicated stack or frame pointers. 403 return true; 404 } 405 406 int64_t SIRegisterInfo::getScratchInstrOffset(const MachineInstr *MI) const { 407 assert(SIInstrInfo::isMUBUF(*MI) || SIInstrInfo::isFLATScratch(*MI)); 408 409 int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), 410 AMDGPU::OpName::offset); 411 return MI->getOperand(OffIdx).getImm(); 412 } 413 414 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI, 415 int Idx) const { 416 if (!SIInstrInfo::isMUBUF(*MI) && !SIInstrInfo::isFLATScratch(*MI)) 417 return 0; 418 419 assert((Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(), 420 AMDGPU::OpName::vaddr) || 421 (Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(), 422 AMDGPU::OpName::saddr))) && 423 "Should never see frame index on non-address operand"); 424 425 return getScratchInstrOffset(MI); 426 } 427 428 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const { 429 if (!SIInstrInfo::isMUBUF(*MI) && !SIInstrInfo::isFLATScratch(*MI)) 430 return false; 431 432 int64_t FullOffset = Offset + getScratchInstrOffset(MI); 433 434 if (SIInstrInfo::isMUBUF(*MI)) 435 return !SIInstrInfo::isLegalMUBUFImmOffset(FullOffset); 436 437 const SIInstrInfo *TII = ST.getInstrInfo(); 438 return !TII->isLegalFLATOffset(FullOffset, AMDGPUAS::PRIVATE_ADDRESS, 439 SIInstrFlags::FlatScratch); 440 } 441 442 Register SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB, 443 int FrameIdx, 444 int64_t Offset) const { 445 MachineBasicBlock::iterator Ins = MBB->begin(); 446 DebugLoc DL; // Defaults to "unknown" 447 448 if (Ins != MBB->end()) 449 DL = Ins->getDebugLoc(); 450 451 MachineFunction *MF = MBB->getParent(); 452 const SIInstrInfo *TII = ST.getInstrInfo(); 453 MachineRegisterInfo &MRI = MF->getRegInfo(); 454 unsigned MovOpc = ST.enableFlatScratch() ? AMDGPU::S_MOV_B32 455 : AMDGPU::V_MOV_B32_e32; 456 457 Register BaseReg = MRI.createVirtualRegister( 458 ST.enableFlatScratch() ? &AMDGPU::SReg_32_XEXEC_HIRegClass 459 : &AMDGPU::VGPR_32RegClass); 460 461 if (Offset == 0) { 462 BuildMI(*MBB, Ins, DL, TII->get(MovOpc), BaseReg) 463 .addFrameIndex(FrameIdx); 464 return BaseReg; 465 } 466 467 Register OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 468 469 Register FIReg = MRI.createVirtualRegister( 470 ST.enableFlatScratch() ? &AMDGPU::SReg_32_XM0RegClass 471 : &AMDGPU::VGPR_32RegClass); 472 473 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg) 474 .addImm(Offset); 475 BuildMI(*MBB, Ins, DL, TII->get(MovOpc), FIReg) 476 .addFrameIndex(FrameIdx); 477 478 if (ST.enableFlatScratch() ) { 479 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_ADD_U32), BaseReg) 480 .addReg(OffsetReg, RegState::Kill) 481 .addReg(FIReg); 482 return BaseReg; 483 } 484 485 TII->getAddNoCarry(*MBB, Ins, DL, BaseReg) 486 .addReg(OffsetReg, RegState::Kill) 487 .addReg(FIReg) 488 .addImm(0); // clamp bit 489 490 return BaseReg; 491 } 492 493 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, Register BaseReg, 494 int64_t Offset) const { 495 const SIInstrInfo *TII = ST.getInstrInfo(); 496 bool IsFlat = TII->isFLATScratch(MI); 497 498 #ifndef NDEBUG 499 // FIXME: Is it possible to be storing a frame index to itself? 500 bool SeenFI = false; 501 for (const MachineOperand &MO: MI.operands()) { 502 if (MO.isFI()) { 503 if (SeenFI) 504 llvm_unreachable("should not see multiple frame indices"); 505 506 SeenFI = true; 507 } 508 } 509 #endif 510 511 MachineOperand *FIOp = 512 TII->getNamedOperand(MI, IsFlat ? AMDGPU::OpName::saddr 513 : AMDGPU::OpName::vaddr); 514 515 MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset); 516 int64_t NewOffset = OffsetOp->getImm() + Offset; 517 518 assert(FIOp && FIOp->isFI() && "frame index must be address operand"); 519 assert(TII->isMUBUF(MI) || TII->isFLATScratch(MI)); 520 521 if (IsFlat) { 522 assert(TII->isLegalFLATOffset(NewOffset, AMDGPUAS::PRIVATE_ADDRESS, 523 SIInstrFlags::FlatScratch) && 524 "offset should be legal"); 525 FIOp->ChangeToRegister(BaseReg, false); 526 OffsetOp->setImm(NewOffset); 527 return; 528 } 529 530 #ifndef NDEBUG 531 MachineOperand *SOffset = TII->getNamedOperand(MI, AMDGPU::OpName::soffset); 532 assert(SOffset->isImm() && SOffset->getImm() == 0); 533 #endif 534 535 assert(SIInstrInfo::isLegalMUBUFImmOffset(NewOffset) && 536 "offset should be legal"); 537 538 FIOp->ChangeToRegister(BaseReg, false); 539 OffsetOp->setImm(NewOffset); 540 } 541 542 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, 543 Register BaseReg, 544 int64_t Offset) const { 545 if (!SIInstrInfo::isMUBUF(*MI) && !SIInstrInfo::isFLATScratch(*MI)) 546 return false; 547 548 int64_t NewOffset = Offset + getScratchInstrOffset(MI); 549 550 if (SIInstrInfo::isMUBUF(*MI)) 551 return SIInstrInfo::isLegalMUBUFImmOffset(NewOffset); 552 553 const SIInstrInfo *TII = ST.getInstrInfo(); 554 return TII->isLegalFLATOffset(NewOffset, AMDGPUAS::PRIVATE_ADDRESS, 555 SIInstrFlags::FlatScratch); 556 } 557 558 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass( 559 const MachineFunction &MF, unsigned Kind) const { 560 // This is inaccurate. It depends on the instruction and address space. The 561 // only place where we should hit this is for dealing with frame indexes / 562 // private accesses, so this is correct in that case. 563 return &AMDGPU::VGPR_32RegClass; 564 } 565 566 static unsigned getNumSubRegsForSpillOp(unsigned Op) { 567 568 switch (Op) { 569 case AMDGPU::SI_SPILL_S1024_SAVE: 570 case AMDGPU::SI_SPILL_S1024_RESTORE: 571 case AMDGPU::SI_SPILL_V1024_SAVE: 572 case AMDGPU::SI_SPILL_V1024_RESTORE: 573 case AMDGPU::SI_SPILL_A1024_SAVE: 574 case AMDGPU::SI_SPILL_A1024_RESTORE: 575 return 32; 576 case AMDGPU::SI_SPILL_S512_SAVE: 577 case AMDGPU::SI_SPILL_S512_RESTORE: 578 case AMDGPU::SI_SPILL_V512_SAVE: 579 case AMDGPU::SI_SPILL_V512_RESTORE: 580 case AMDGPU::SI_SPILL_A512_SAVE: 581 case AMDGPU::SI_SPILL_A512_RESTORE: 582 return 16; 583 case AMDGPU::SI_SPILL_S256_SAVE: 584 case AMDGPU::SI_SPILL_S256_RESTORE: 585 case AMDGPU::SI_SPILL_V256_SAVE: 586 case AMDGPU::SI_SPILL_V256_RESTORE: 587 case AMDGPU::SI_SPILL_A256_SAVE: 588 case AMDGPU::SI_SPILL_A256_RESTORE: 589 return 8; 590 case AMDGPU::SI_SPILL_S192_SAVE: 591 case AMDGPU::SI_SPILL_S192_RESTORE: 592 case AMDGPU::SI_SPILL_V192_SAVE: 593 case AMDGPU::SI_SPILL_V192_RESTORE: 594 case AMDGPU::SI_SPILL_A192_SAVE: 595 case AMDGPU::SI_SPILL_A192_RESTORE: 596 return 6; 597 case AMDGPU::SI_SPILL_S160_SAVE: 598 case AMDGPU::SI_SPILL_S160_RESTORE: 599 case AMDGPU::SI_SPILL_V160_SAVE: 600 case AMDGPU::SI_SPILL_V160_RESTORE: 601 case AMDGPU::SI_SPILL_A160_SAVE: 602 case AMDGPU::SI_SPILL_A160_RESTORE: 603 return 5; 604 case AMDGPU::SI_SPILL_S128_SAVE: 605 case AMDGPU::SI_SPILL_S128_RESTORE: 606 case AMDGPU::SI_SPILL_V128_SAVE: 607 case AMDGPU::SI_SPILL_V128_RESTORE: 608 case AMDGPU::SI_SPILL_A128_SAVE: 609 case AMDGPU::SI_SPILL_A128_RESTORE: 610 return 4; 611 case AMDGPU::SI_SPILL_S96_SAVE: 612 case AMDGPU::SI_SPILL_S96_RESTORE: 613 case AMDGPU::SI_SPILL_V96_SAVE: 614 case AMDGPU::SI_SPILL_V96_RESTORE: 615 case AMDGPU::SI_SPILL_A96_SAVE: 616 case AMDGPU::SI_SPILL_A96_RESTORE: 617 return 3; 618 case AMDGPU::SI_SPILL_S64_SAVE: 619 case AMDGPU::SI_SPILL_S64_RESTORE: 620 case AMDGPU::SI_SPILL_V64_SAVE: 621 case AMDGPU::SI_SPILL_V64_RESTORE: 622 case AMDGPU::SI_SPILL_A64_SAVE: 623 case AMDGPU::SI_SPILL_A64_RESTORE: 624 return 2; 625 case AMDGPU::SI_SPILL_S32_SAVE: 626 case AMDGPU::SI_SPILL_S32_RESTORE: 627 case AMDGPU::SI_SPILL_V32_SAVE: 628 case AMDGPU::SI_SPILL_V32_RESTORE: 629 case AMDGPU::SI_SPILL_A32_SAVE: 630 case AMDGPU::SI_SPILL_A32_RESTORE: 631 return 1; 632 default: llvm_unreachable("Invalid spill opcode"); 633 } 634 } 635 636 static int getOffsetMUBUFStore(unsigned Opc) { 637 switch (Opc) { 638 case AMDGPU::BUFFER_STORE_DWORD_OFFEN: 639 return AMDGPU::BUFFER_STORE_DWORD_OFFSET; 640 case AMDGPU::BUFFER_STORE_BYTE_OFFEN: 641 return AMDGPU::BUFFER_STORE_BYTE_OFFSET; 642 case AMDGPU::BUFFER_STORE_SHORT_OFFEN: 643 return AMDGPU::BUFFER_STORE_SHORT_OFFSET; 644 case AMDGPU::BUFFER_STORE_DWORDX2_OFFEN: 645 return AMDGPU::BUFFER_STORE_DWORDX2_OFFSET; 646 case AMDGPU::BUFFER_STORE_DWORDX4_OFFEN: 647 return AMDGPU::BUFFER_STORE_DWORDX4_OFFSET; 648 case AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFEN: 649 return AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFSET; 650 case AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFEN: 651 return AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFSET; 652 default: 653 return -1; 654 } 655 } 656 657 static int getOffsetMUBUFLoad(unsigned Opc) { 658 switch (Opc) { 659 case AMDGPU::BUFFER_LOAD_DWORD_OFFEN: 660 return AMDGPU::BUFFER_LOAD_DWORD_OFFSET; 661 case AMDGPU::BUFFER_LOAD_UBYTE_OFFEN: 662 return AMDGPU::BUFFER_LOAD_UBYTE_OFFSET; 663 case AMDGPU::BUFFER_LOAD_SBYTE_OFFEN: 664 return AMDGPU::BUFFER_LOAD_SBYTE_OFFSET; 665 case AMDGPU::BUFFER_LOAD_USHORT_OFFEN: 666 return AMDGPU::BUFFER_LOAD_USHORT_OFFSET; 667 case AMDGPU::BUFFER_LOAD_SSHORT_OFFEN: 668 return AMDGPU::BUFFER_LOAD_SSHORT_OFFSET; 669 case AMDGPU::BUFFER_LOAD_DWORDX2_OFFEN: 670 return AMDGPU::BUFFER_LOAD_DWORDX2_OFFSET; 671 case AMDGPU::BUFFER_LOAD_DWORDX4_OFFEN: 672 return AMDGPU::BUFFER_LOAD_DWORDX4_OFFSET; 673 case AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFEN: 674 return AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFSET; 675 case AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFEN: 676 return AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFSET; 677 case AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFEN: 678 return AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFSET; 679 case AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFEN: 680 return AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFSET; 681 case AMDGPU::BUFFER_LOAD_SHORT_D16_OFFEN: 682 return AMDGPU::BUFFER_LOAD_SHORT_D16_OFFSET; 683 case AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFEN: 684 return AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFSET; 685 default: 686 return -1; 687 } 688 } 689 690 static MachineInstrBuilder spillVGPRtoAGPR(const GCNSubtarget &ST, 691 MachineBasicBlock::iterator MI, 692 int Index, 693 unsigned Lane, 694 unsigned ValueReg, 695 bool IsKill) { 696 MachineBasicBlock *MBB = MI->getParent(); 697 MachineFunction *MF = MI->getParent()->getParent(); 698 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 699 const SIInstrInfo *TII = ST.getInstrInfo(); 700 701 MCPhysReg Reg = MFI->getVGPRToAGPRSpill(Index, Lane); 702 703 if (Reg == AMDGPU::NoRegister) 704 return MachineInstrBuilder(); 705 706 bool IsStore = MI->mayStore(); 707 MachineRegisterInfo &MRI = MF->getRegInfo(); 708 auto *TRI = static_cast<const SIRegisterInfo*>(MRI.getTargetRegisterInfo()); 709 710 unsigned Dst = IsStore ? Reg : ValueReg; 711 unsigned Src = IsStore ? ValueReg : Reg; 712 unsigned Opc = (IsStore ^ TRI->isVGPR(MRI, Reg)) ? AMDGPU::V_ACCVGPR_WRITE_B32_e64 713 : AMDGPU::V_ACCVGPR_READ_B32_e64; 714 715 auto MIB = BuildMI(*MBB, MI, MI->getDebugLoc(), TII->get(Opc), Dst) 716 .addReg(Src, getKillRegState(IsKill)); 717 MIB->setAsmPrinterFlag(MachineInstr::ReloadReuse); 718 return MIB; 719 } 720 721 // This differs from buildSpillLoadStore by only scavenging a VGPR. It does not 722 // need to handle the case where an SGPR may need to be spilled while spilling. 723 static bool buildMUBUFOffsetLoadStore(const GCNSubtarget &ST, 724 MachineFrameInfo &MFI, 725 MachineBasicBlock::iterator MI, 726 int Index, 727 int64_t Offset) { 728 const SIInstrInfo *TII = ST.getInstrInfo(); 729 MachineBasicBlock *MBB = MI->getParent(); 730 const DebugLoc &DL = MI->getDebugLoc(); 731 bool IsStore = MI->mayStore(); 732 733 unsigned Opc = MI->getOpcode(); 734 int LoadStoreOp = IsStore ? 735 getOffsetMUBUFStore(Opc) : getOffsetMUBUFLoad(Opc); 736 if (LoadStoreOp == -1) 737 return false; 738 739 const MachineOperand *Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::vdata); 740 if (spillVGPRtoAGPR(ST, MI, Index, 0, Reg->getReg(), false).getInstr()) 741 return true; 742 743 MachineInstrBuilder NewMI = 744 BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp)) 745 .add(*Reg) 746 .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)) 747 .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)) 748 .addImm(Offset) 749 .addImm(0) // cpol 750 .addImm(0) // tfe 751 .addImm(0) // swz 752 .cloneMemRefs(*MI); 753 754 const MachineOperand *VDataIn = TII->getNamedOperand(*MI, 755 AMDGPU::OpName::vdata_in); 756 if (VDataIn) 757 NewMI.add(*VDataIn); 758 return true; 759 } 760 761 static unsigned getFlatScratchSpillOpcode(const SIInstrInfo *TII, 762 unsigned LoadStoreOp, 763 unsigned EltSize) { 764 bool IsStore = TII->get(LoadStoreOp).mayStore(); 765 bool UseST = 766 AMDGPU::getNamedOperandIdx(LoadStoreOp, AMDGPU::OpName::vaddr) < 0 && 767 AMDGPU::getNamedOperandIdx(LoadStoreOp, AMDGPU::OpName::saddr) < 0; 768 769 switch (EltSize) { 770 case 4: 771 LoadStoreOp = IsStore ? AMDGPU::SCRATCH_STORE_DWORD_SADDR 772 : AMDGPU::SCRATCH_LOAD_DWORD_SADDR; 773 break; 774 case 8: 775 LoadStoreOp = IsStore ? AMDGPU::SCRATCH_STORE_DWORDX2_SADDR 776 : AMDGPU::SCRATCH_LOAD_DWORDX2_SADDR; 777 break; 778 case 12: 779 LoadStoreOp = IsStore ? AMDGPU::SCRATCH_STORE_DWORDX3_SADDR 780 : AMDGPU::SCRATCH_LOAD_DWORDX3_SADDR; 781 break; 782 case 16: 783 LoadStoreOp = IsStore ? AMDGPU::SCRATCH_STORE_DWORDX4_SADDR 784 : AMDGPU::SCRATCH_LOAD_DWORDX4_SADDR; 785 break; 786 default: 787 llvm_unreachable("Unexpected spill load/store size!"); 788 } 789 790 if (UseST) 791 LoadStoreOp = AMDGPU::getFlatScratchInstSTfromSS(LoadStoreOp); 792 793 return LoadStoreOp; 794 } 795 796 void SIRegisterInfo::buildSpillLoadStore(MachineBasicBlock::iterator MI, 797 unsigned LoadStoreOp, 798 int Index, 799 Register ValueReg, 800 bool IsKill, 801 MCRegister ScratchOffsetReg, 802 int64_t InstOffset, 803 MachineMemOperand *MMO, 804 RegScavenger *RS) const { 805 MachineBasicBlock *MBB = MI->getParent(); 806 MachineFunction *MF = MI->getParent()->getParent(); 807 const SIInstrInfo *TII = ST.getInstrInfo(); 808 const MachineFrameInfo &MFI = MF->getFrameInfo(); 809 const SIMachineFunctionInfo *FuncInfo = MF->getInfo<SIMachineFunctionInfo>(); 810 811 const MCInstrDesc *Desc = &TII->get(LoadStoreOp); 812 const DebugLoc &DL = MI->getDebugLoc(); 813 bool IsStore = Desc->mayStore(); 814 bool IsFlat = TII->isFLATScratch(LoadStoreOp); 815 816 bool Scavenged = false; 817 MCRegister SOffset = ScratchOffsetReg; 818 819 const TargetRegisterClass *RC = getRegClassForReg(MF->getRegInfo(), ValueReg); 820 // On gfx90a+ AGPR is a regular VGPR acceptable for loads and stores. 821 const bool IsAGPR = !ST.hasGFX90AInsts() && hasAGPRs(RC); 822 const unsigned RegWidth = AMDGPU::getRegBitWidth(RC->getID()) / 8; 823 824 // Always use 4 byte operations for AGPRs because we need to scavenge 825 // a temporary VGPR. 826 unsigned EltSize = (IsFlat && !IsAGPR) ? std::min(RegWidth, 16u) : 4u; 827 unsigned NumSubRegs = RegWidth / EltSize; 828 unsigned Size = NumSubRegs * EltSize; 829 unsigned RemSize = RegWidth - Size; 830 unsigned NumRemSubRegs = RemSize ? 1 : 0; 831 int64_t Offset = InstOffset + MFI.getObjectOffset(Index); 832 int64_t MaxOffset = Offset + Size + RemSize - EltSize; 833 int64_t ScratchOffsetRegDelta = 0; 834 835 if (IsFlat && EltSize > 4) { 836 LoadStoreOp = getFlatScratchSpillOpcode(TII, LoadStoreOp, EltSize); 837 Desc = &TII->get(LoadStoreOp); 838 } 839 840 Align Alignment = MFI.getObjectAlign(Index); 841 const MachinePointerInfo &BasePtrInfo = MMO->getPointerInfo(); 842 843 assert((IsFlat || ((Offset % EltSize) == 0)) && 844 "unexpected VGPR spill offset"); 845 846 bool IsOffsetLegal = 847 IsFlat ? TII->isLegalFLATOffset(MaxOffset, AMDGPUAS::PRIVATE_ADDRESS, 848 SIInstrFlags::FlatScratch) 849 : SIInstrInfo::isLegalMUBUFImmOffset(MaxOffset); 850 if (!IsOffsetLegal || (IsFlat && !SOffset && !ST.hasFlatScratchSTMode())) { 851 SOffset = MCRegister(); 852 853 // We currently only support spilling VGPRs to EltSize boundaries, meaning 854 // we can simplify the adjustment of Offset here to just scale with 855 // WavefrontSize. 856 if (!IsFlat) 857 Offset *= ST.getWavefrontSize(); 858 859 // We don't have access to the register scavenger if this function is called 860 // during PEI::scavengeFrameVirtualRegs(). 861 if (RS) 862 SOffset = RS->scavengeRegister(&AMDGPU::SGPR_32RegClass, MI, 0, false); 863 864 if (!SOffset) { 865 // There are no free SGPRs, and since we are in the process of spilling 866 // VGPRs too. Since we need a VGPR in order to spill SGPRs (this is true 867 // on SI/CI and on VI it is true until we implement spilling using scalar 868 // stores), we have no way to free up an SGPR. Our solution here is to 869 // add the offset directly to the ScratchOffset or StackPtrOffset 870 // register, and then subtract the offset after the spill to return the 871 // register to it's original value. 872 if (!ScratchOffsetReg) 873 ScratchOffsetReg = FuncInfo->getStackPtrOffsetReg(); 874 SOffset = ScratchOffsetReg; 875 ScratchOffsetRegDelta = Offset; 876 } else { 877 Scavenged = true; 878 } 879 880 if (!SOffset) 881 report_fatal_error("could not scavenge SGPR to spill in entry function"); 882 883 if (ScratchOffsetReg == AMDGPU::NoRegister) { 884 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), SOffset) 885 .addImm(Offset); 886 } else { 887 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset) 888 .addReg(ScratchOffsetReg) 889 .addImm(Offset); 890 } 891 892 Offset = 0; 893 } 894 895 if (IsFlat && SOffset == AMDGPU::NoRegister) { 896 assert(AMDGPU::getNamedOperandIdx(LoadStoreOp, AMDGPU::OpName::vaddr) < 0 897 && "Unexpected vaddr for flat scratch with a FI operand"); 898 899 assert(ST.hasFlatScratchSTMode()); 900 LoadStoreOp = AMDGPU::getFlatScratchInstSTfromSS(LoadStoreOp); 901 Desc = &TII->get(LoadStoreOp); 902 } 903 904 Register TmpReg; 905 906 for (unsigned i = 0, e = NumSubRegs + NumRemSubRegs, RegOffset = 0; i != e; 907 ++i, RegOffset += EltSize) { 908 if (i == NumSubRegs) { 909 EltSize = RemSize; 910 LoadStoreOp = getFlatScratchSpillOpcode(TII, LoadStoreOp, EltSize); 911 } 912 Desc = &TII->get(LoadStoreOp); 913 914 unsigned NumRegs = EltSize / 4; 915 Register SubReg = e == 1 916 ? ValueReg 917 : Register(getSubReg(ValueReg, 918 getSubRegFromChannel(RegOffset / 4, NumRegs))); 919 920 unsigned SOffsetRegState = 0; 921 unsigned SrcDstRegState = getDefRegState(!IsStore); 922 if (i + 1 == e) { 923 SOffsetRegState |= getKillRegState(Scavenged); 924 // The last implicit use carries the "Kill" flag. 925 SrcDstRegState |= getKillRegState(IsKill); 926 } 927 928 // Make sure the whole register is defined if there are undef components by 929 // adding an implicit def of the super-reg on the first instruction. 930 bool NeedSuperRegDef = e > 1 && IsStore && i == 0; 931 bool NeedSuperRegImpOperand = e > 1; 932 933 unsigned Lane = RegOffset / 4; 934 unsigned LaneE = (RegOffset + EltSize) / 4; 935 for ( ; Lane != LaneE; ++Lane) { 936 bool IsSubReg = e > 1 || EltSize > 4; 937 Register Sub = IsSubReg 938 ? Register(getSubReg(ValueReg, getSubRegFromChannel(Lane))) 939 : ValueReg; 940 auto MIB = spillVGPRtoAGPR(ST, MI, Index, Lane, Sub, IsKill); 941 if (!MIB.getInstr()) 942 break; 943 if (NeedSuperRegDef || (IsSubReg && IsStore && Lane == 0)) { 944 MIB.addReg(ValueReg, RegState::ImplicitDefine); 945 NeedSuperRegDef = false; 946 } 947 if (IsSubReg || NeedSuperRegImpOperand) { 948 NeedSuperRegImpOperand = true; 949 unsigned State = SrcDstRegState; 950 if (Lane + 1 != LaneE) 951 State &= ~RegState::Kill; 952 MIB.addReg(ValueReg, RegState::Implicit | State); 953 } 954 } 955 956 if (Lane == LaneE) // Fully spilled into AGPRs. 957 continue; 958 959 // Offset in bytes from the beginning of the ValueReg to its portion we 960 // still need to spill. It may differ from RegOffset if a portion of 961 // current SubReg has been already spilled into AGPRs by the loop above. 962 unsigned RemRegOffset = Lane * 4; 963 unsigned RemEltSize = EltSize - (RemRegOffset - RegOffset); 964 if (RemEltSize != EltSize) { // Partially spilled to AGPRs 965 assert(IsFlat && EltSize > 4); 966 967 unsigned NumRegs = RemEltSize / 4; 968 SubReg = Register(getSubReg(ValueReg, 969 getSubRegFromChannel(RemRegOffset / 4, NumRegs))); 970 unsigned Opc = getFlatScratchSpillOpcode(TII, LoadStoreOp, RemEltSize); 971 Desc = &TII->get(Opc); 972 } 973 974 unsigned FinalReg = SubReg; 975 976 if (IsAGPR) { 977 assert(EltSize == 4); 978 979 if (!TmpReg) { 980 assert(RS && "Needs to have RegScavenger to spill an AGPR!"); 981 // FIXME: change to scavengeRegisterBackwards() 982 TmpReg = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 983 RS->setRegUsed(TmpReg); 984 } 985 if (IsStore) { 986 auto AccRead = BuildMI(*MBB, MI, DL, 987 TII->get(AMDGPU::V_ACCVGPR_READ_B32_e64), TmpReg) 988 .addReg(SubReg, getKillRegState(IsKill)); 989 if (NeedSuperRegDef) 990 AccRead.addReg(ValueReg, RegState::ImplicitDefine); 991 AccRead->setAsmPrinterFlag(MachineInstr::ReloadReuse); 992 } 993 SubReg = TmpReg; 994 } 995 996 MachinePointerInfo PInfo = BasePtrInfo.getWithOffset(RemRegOffset); 997 MachineMemOperand *NewMMO = 998 MF->getMachineMemOperand(PInfo, MMO->getFlags(), RemEltSize, 999 commonAlignment(Alignment, RemRegOffset)); 1000 1001 auto MIB = BuildMI(*MBB, MI, DL, *Desc) 1002 .addReg(SubReg, 1003 getDefRegState(!IsStore) | getKillRegState(IsKill)); 1004 if (!IsFlat) 1005 MIB.addReg(FuncInfo->getScratchRSrcReg()); 1006 1007 if (SOffset == AMDGPU::NoRegister) { 1008 if (!IsFlat) 1009 MIB.addImm(0); 1010 } else { 1011 MIB.addReg(SOffset, SOffsetRegState); 1012 } 1013 MIB.addImm(Offset + RemRegOffset) 1014 .addImm(0); // cpol 1015 if (!IsFlat) 1016 MIB.addImm(0) // tfe 1017 .addImm(0); // swz 1018 MIB.addMemOperand(NewMMO); 1019 1020 if (!IsAGPR && NeedSuperRegDef) 1021 MIB.addReg(ValueReg, RegState::ImplicitDefine); 1022 1023 if (!IsStore && TmpReg != AMDGPU::NoRegister) { 1024 MIB = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ACCVGPR_WRITE_B32_e64), 1025 FinalReg) 1026 .addReg(TmpReg, RegState::Kill); 1027 MIB->setAsmPrinterFlag(MachineInstr::ReloadReuse); 1028 } 1029 1030 if (NeedSuperRegImpOperand) 1031 MIB.addReg(ValueReg, RegState::Implicit | SrcDstRegState); 1032 } 1033 1034 if (ScratchOffsetRegDelta != 0) { 1035 // Subtract the offset we added to the ScratchOffset register. 1036 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), SOffset) 1037 .addReg(SOffset) 1038 .addImm(ScratchOffsetRegDelta); 1039 } 1040 } 1041 1042 // Generate a VMEM access which loads or stores the VGPR containing an SGPR 1043 // spill such that all the lanes set in VGPRLanes are loaded or stored. 1044 // This generates exec mask manipulation and will use SGPRs available in MI 1045 // or VGPR lanes in the VGPR to save and restore the exec mask. 1046 void SIRegisterInfo::buildSGPRSpillLoadStore(MachineBasicBlock::iterator MI, 1047 int Index, int Offset, 1048 unsigned EltSize, Register VGPR, 1049 int64_t VGPRLanes, 1050 RegScavenger *RS, 1051 bool IsLoad) const { 1052 MachineBasicBlock *MBB = MI->getParent(); 1053 MachineFunction *MF = MBB->getParent(); 1054 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 1055 const SIInstrInfo *TII = ST.getInstrInfo(); 1056 1057 Register SuperReg = MI->getOperand(0).getReg(); 1058 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 1059 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 1060 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 1061 unsigned FirstPart = Offset * 32; 1062 unsigned ExecLane = 0; 1063 1064 bool IsKill = MI->getOperand(0).isKill(); 1065 const DebugLoc &DL = MI->getDebugLoc(); 1066 1067 // Cannot handle load/store to EXEC 1068 assert(SuperReg != AMDGPU::EXEC_LO && SuperReg != AMDGPU::EXEC_HI && 1069 SuperReg != AMDGPU::EXEC && "exec should never spill"); 1070 1071 // On Wave32 only handle EXEC_LO. 1072 // On Wave64 only update EXEC_HI if there is sufficent space for a copy. 1073 bool OnlyExecLo = isWave32 || NumSubRegs == 1 || SuperReg == AMDGPU::EXEC_HI; 1074 1075 unsigned ExecMovOpc = OnlyExecLo ? AMDGPU::S_MOV_B32 : AMDGPU::S_MOV_B64; 1076 Register ExecReg = OnlyExecLo ? AMDGPU::EXEC_LO : AMDGPU::EXEC; 1077 Register SavedExecReg; 1078 1079 // Backup EXEC 1080 if (OnlyExecLo) { 1081 SavedExecReg = 1082 NumSubRegs == 1 1083 ? SuperReg 1084 : Register(getSubReg(SuperReg, SplitParts[FirstPart + ExecLane])); 1085 } else { 1086 // If src/dst is an odd size it is possible subreg0 is not aligned. 1087 for (; ExecLane < (NumSubRegs - 1); ++ExecLane) { 1088 SavedExecReg = getMatchingSuperReg( 1089 getSubReg(SuperReg, SplitParts[FirstPart + ExecLane]), AMDGPU::sub0, 1090 &AMDGPU::SReg_64_XEXECRegClass); 1091 if (SavedExecReg) 1092 break; 1093 } 1094 } 1095 assert(SavedExecReg); 1096 BuildMI(*MBB, MI, DL, TII->get(ExecMovOpc), SavedExecReg).addReg(ExecReg); 1097 1098 // Setup EXEC 1099 BuildMI(*MBB, MI, DL, TII->get(ExecMovOpc), ExecReg).addImm(VGPRLanes); 1100 1101 // Load/store VGPR 1102 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 1103 assert(FrameInfo.getStackID(Index) != TargetStackID::SGPRSpill); 1104 1105 Register FrameReg = FrameInfo.isFixedObjectIndex(Index) && hasBasePointer(*MF) 1106 ? getBaseRegister() 1107 : getFrameRegister(*MF); 1108 1109 Align Alignment = FrameInfo.getObjectAlign(Index); 1110 MachinePointerInfo PtrInfo = 1111 MachinePointerInfo::getFixedStack(*MF, Index); 1112 MachineMemOperand *MMO = MF->getMachineMemOperand( 1113 PtrInfo, IsLoad ? MachineMemOperand::MOLoad : MachineMemOperand::MOStore, 1114 EltSize, Alignment); 1115 1116 if (IsLoad) { 1117 unsigned Opc = ST.enableFlatScratch() ? AMDGPU::SCRATCH_LOAD_DWORD_SADDR 1118 : AMDGPU::BUFFER_LOAD_DWORD_OFFSET; 1119 buildSpillLoadStore(MI, Opc, 1120 Index, 1121 VGPR, false, 1122 FrameReg, 1123 Offset * EltSize, MMO, 1124 RS); 1125 } else { 1126 unsigned Opc = ST.enableFlatScratch() ? AMDGPU::SCRATCH_STORE_DWORD_SADDR 1127 : AMDGPU::BUFFER_STORE_DWORD_OFFSET; 1128 buildSpillLoadStore(MI, Opc, Index, VGPR, 1129 IsKill, FrameReg, 1130 Offset * EltSize, MMO, RS); 1131 // This only ever adds one VGPR spill 1132 MFI->addToSpilledVGPRs(1); 1133 } 1134 1135 // Restore EXEC 1136 BuildMI(*MBB, MI, DL, TII->get(ExecMovOpc), ExecReg) 1137 .addReg(SavedExecReg, getKillRegState(IsLoad || IsKill)); 1138 1139 // Restore clobbered SGPRs 1140 if (IsLoad) { 1141 // Nothing to do; register will be overwritten 1142 } else if (!IsKill) { 1143 // Restore SGPRs from appropriate VGPR lanes 1144 if (!OnlyExecLo) { 1145 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READLANE_B32), 1146 getSubReg(SuperReg, SplitParts[FirstPart + ExecLane + 1])) 1147 .addReg(VGPR) 1148 .addImm(ExecLane + 1); 1149 } 1150 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READLANE_B32), 1151 NumSubRegs == 1 ? SavedExecReg 1152 : Register(getSubReg( 1153 SuperReg, SplitParts[FirstPart + ExecLane]))) 1154 .addReg(VGPR, RegState::Kill) 1155 .addImm(ExecLane); 1156 } 1157 } 1158 1159 bool SIRegisterInfo::spillSGPR(MachineBasicBlock::iterator MI, 1160 int Index, 1161 RegScavenger *RS, 1162 bool OnlyToVGPR) const { 1163 MachineBasicBlock *MBB = MI->getParent(); 1164 MachineFunction *MF = MBB->getParent(); 1165 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 1166 1167 ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills 1168 = MFI->getSGPRToVGPRSpills(Index); 1169 bool SpillToVGPR = !VGPRSpills.empty(); 1170 if (OnlyToVGPR && !SpillToVGPR) 1171 return false; 1172 1173 const SIInstrInfo *TII = ST.getInstrInfo(); 1174 1175 Register SuperReg = MI->getOperand(0).getReg(); 1176 bool IsKill = MI->getOperand(0).isKill(); 1177 const DebugLoc &DL = MI->getDebugLoc(); 1178 1179 assert(SpillToVGPR || (SuperReg != MFI->getStackPtrOffsetReg() && 1180 SuperReg != MFI->getFrameOffsetReg())); 1181 1182 assert(SuperReg != AMDGPU::M0 && "m0 should never spill"); 1183 assert(SuperReg != AMDGPU::EXEC_LO && SuperReg != AMDGPU::EXEC_HI && 1184 SuperReg != AMDGPU::EXEC && "exec should never spill"); 1185 1186 unsigned EltSize = 4; 1187 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 1188 1189 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 1190 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 1191 1192 if (SpillToVGPR) { 1193 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 1194 Register SubReg = NumSubRegs == 1 1195 ? SuperReg 1196 : Register(getSubReg(SuperReg, SplitParts[i])); 1197 SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i]; 1198 1199 bool UseKill = IsKill && i == NumSubRegs - 1; 1200 1201 // Mark the "old value of vgpr" input undef only if this is the first sgpr 1202 // spill to this specific vgpr in the first basic block. 1203 auto MIB = 1204 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_WRITELANE_B32), Spill.VGPR) 1205 .addReg(SubReg, getKillRegState(UseKill)) 1206 .addImm(Spill.Lane) 1207 .addReg(Spill.VGPR); 1208 1209 if (i == 0 && NumSubRegs > 1) { 1210 // We may be spilling a super-register which is only partially defined, 1211 // and need to ensure later spills think the value is defined. 1212 MIB.addReg(SuperReg, RegState::ImplicitDefine); 1213 } 1214 1215 if (NumSubRegs > 1) 1216 MIB.addReg(SuperReg, getKillRegState(UseKill) | RegState::Implicit); 1217 1218 // FIXME: Since this spills to another register instead of an actual 1219 // frame index, we should delete the frame index when all references to 1220 // it are fixed. 1221 } 1222 } else { 1223 // Scavenged temporary VGPR to use. It must be scavenged once for any number 1224 // of spilled subregs. 1225 Register TmpVGPR = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 1226 RS->setRegUsed(TmpVGPR); 1227 1228 // SubReg carries the "Kill" flag when SubReg == SuperReg. 1229 unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill); 1230 1231 unsigned PerVGPR = 32; 1232 unsigned NumVGPRs = (NumSubRegs + (PerVGPR - 1)) / PerVGPR; 1233 int64_t VGPRLanes = (1LL << std::min(PerVGPR, NumSubRegs)) - 1LL; 1234 1235 for (unsigned Offset = 0; Offset < NumVGPRs; ++Offset) { 1236 unsigned TmpVGPRFlags = RegState::Undef; 1237 1238 // Write sub registers into the VGPR 1239 for (unsigned i = Offset * PerVGPR, 1240 e = std::min((Offset + 1) * PerVGPR, NumSubRegs); 1241 i < e; ++i) { 1242 Register SubReg = NumSubRegs == 1 1243 ? SuperReg 1244 : Register(getSubReg(SuperReg, SplitParts[i])); 1245 1246 MachineInstrBuilder WriteLane = 1247 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_WRITELANE_B32), TmpVGPR) 1248 .addReg(SubReg, SubKillState) 1249 .addImm(i % PerVGPR) 1250 .addReg(TmpVGPR, TmpVGPRFlags); 1251 TmpVGPRFlags = 0; 1252 1253 // There could be undef components of a spilled super register. 1254 // TODO: Can we detect this and skip the spill? 1255 if (NumSubRegs > 1) { 1256 // The last implicit use of the SuperReg carries the "Kill" flag. 1257 unsigned SuperKillState = 0; 1258 if (i + 1 == NumSubRegs) 1259 SuperKillState |= getKillRegState(IsKill); 1260 WriteLane.addReg(SuperReg, RegState::Implicit | SuperKillState); 1261 } 1262 } 1263 1264 // Write out VGPR 1265 buildSGPRSpillLoadStore(MI, Index, Offset, EltSize, TmpVGPR, VGPRLanes, 1266 RS, false); 1267 } 1268 } 1269 1270 MI->eraseFromParent(); 1271 MFI->addToSpilledSGPRs(NumSubRegs); 1272 return true; 1273 } 1274 1275 bool SIRegisterInfo::restoreSGPR(MachineBasicBlock::iterator MI, 1276 int Index, 1277 RegScavenger *RS, 1278 bool OnlyToVGPR) const { 1279 MachineFunction *MF = MI->getParent()->getParent(); 1280 MachineBasicBlock *MBB = MI->getParent(); 1281 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 1282 1283 ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills 1284 = MFI->getSGPRToVGPRSpills(Index); 1285 bool SpillToVGPR = !VGPRSpills.empty(); 1286 if (OnlyToVGPR && !SpillToVGPR) 1287 return false; 1288 1289 const SIInstrInfo *TII = ST.getInstrInfo(); 1290 const DebugLoc &DL = MI->getDebugLoc(); 1291 1292 Register SuperReg = MI->getOperand(0).getReg(); 1293 1294 assert(SuperReg != AMDGPU::M0 && "m0 should never spill"); 1295 assert(SuperReg != AMDGPU::EXEC_LO && SuperReg != AMDGPU::EXEC_HI && 1296 SuperReg != AMDGPU::EXEC && "exec should never spill"); 1297 1298 unsigned EltSize = 4; 1299 1300 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 1301 1302 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 1303 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 1304 1305 if (SpillToVGPR) { 1306 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 1307 Register SubReg = NumSubRegs == 1 1308 ? SuperReg 1309 : Register(getSubReg(SuperReg, SplitParts[i])); 1310 1311 SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i]; 1312 auto MIB = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READLANE_B32), SubReg) 1313 .addReg(Spill.VGPR) 1314 .addImm(Spill.Lane); 1315 if (NumSubRegs > 1 && i == 0) 1316 MIB.addReg(SuperReg, RegState::ImplicitDefine); 1317 } 1318 } else { 1319 Register TmpVGPR = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 1320 RS->setRegUsed(TmpVGPR); 1321 1322 unsigned PerVGPR = 32; 1323 unsigned NumVGPRs = (NumSubRegs + (PerVGPR - 1)) / PerVGPR; 1324 int64_t VGPRLanes = (1LL << std::min(PerVGPR, NumSubRegs)) - 1LL; 1325 1326 for (unsigned Offset = 0; Offset < NumVGPRs; ++Offset) { 1327 // Load in VGPR data 1328 buildSGPRSpillLoadStore(MI, Index, Offset, EltSize, TmpVGPR, VGPRLanes, 1329 RS, true); 1330 1331 // Unpack lanes 1332 for (unsigned i = Offset * PerVGPR, 1333 e = std::min((Offset + 1) * PerVGPR, NumSubRegs); 1334 i < e; ++i) { 1335 Register SubReg = NumSubRegs == 1 1336 ? SuperReg 1337 : Register(getSubReg(SuperReg, SplitParts[i])); 1338 1339 bool LastSubReg = (i + 1 == e); 1340 auto MIB = 1341 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READLANE_B32), SubReg) 1342 .addReg(TmpVGPR, getKillRegState(LastSubReg)) 1343 .addImm(i); 1344 if (NumSubRegs > 1 && i == 0) 1345 MIB.addReg(SuperReg, RegState::ImplicitDefine); 1346 } 1347 } 1348 } 1349 1350 MI->eraseFromParent(); 1351 return true; 1352 } 1353 1354 /// Special case of eliminateFrameIndex. Returns true if the SGPR was spilled to 1355 /// a VGPR and the stack slot can be safely eliminated when all other users are 1356 /// handled. 1357 bool SIRegisterInfo::eliminateSGPRToVGPRSpillFrameIndex( 1358 MachineBasicBlock::iterator MI, 1359 int FI, 1360 RegScavenger *RS) const { 1361 switch (MI->getOpcode()) { 1362 case AMDGPU::SI_SPILL_S1024_SAVE: 1363 case AMDGPU::SI_SPILL_S512_SAVE: 1364 case AMDGPU::SI_SPILL_S256_SAVE: 1365 case AMDGPU::SI_SPILL_S192_SAVE: 1366 case AMDGPU::SI_SPILL_S160_SAVE: 1367 case AMDGPU::SI_SPILL_S128_SAVE: 1368 case AMDGPU::SI_SPILL_S96_SAVE: 1369 case AMDGPU::SI_SPILL_S64_SAVE: 1370 case AMDGPU::SI_SPILL_S32_SAVE: 1371 return spillSGPR(MI, FI, RS, true); 1372 case AMDGPU::SI_SPILL_S1024_RESTORE: 1373 case AMDGPU::SI_SPILL_S512_RESTORE: 1374 case AMDGPU::SI_SPILL_S256_RESTORE: 1375 case AMDGPU::SI_SPILL_S192_RESTORE: 1376 case AMDGPU::SI_SPILL_S160_RESTORE: 1377 case AMDGPU::SI_SPILL_S128_RESTORE: 1378 case AMDGPU::SI_SPILL_S96_RESTORE: 1379 case AMDGPU::SI_SPILL_S64_RESTORE: 1380 case AMDGPU::SI_SPILL_S32_RESTORE: 1381 return restoreSGPR(MI, FI, RS, true); 1382 default: 1383 llvm_unreachable("not an SGPR spill instruction"); 1384 } 1385 } 1386 1387 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, 1388 int SPAdj, unsigned FIOperandNum, 1389 RegScavenger *RS) const { 1390 MachineFunction *MF = MI->getParent()->getParent(); 1391 MachineBasicBlock *MBB = MI->getParent(); 1392 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 1393 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 1394 const SIInstrInfo *TII = ST.getInstrInfo(); 1395 DebugLoc DL = MI->getDebugLoc(); 1396 1397 assert(SPAdj == 0 && "unhandled SP adjustment in call sequence?"); 1398 1399 MachineOperand &FIOp = MI->getOperand(FIOperandNum); 1400 int Index = MI->getOperand(FIOperandNum).getIndex(); 1401 1402 Register FrameReg = FrameInfo.isFixedObjectIndex(Index) && hasBasePointer(*MF) 1403 ? getBaseRegister() 1404 : getFrameRegister(*MF); 1405 1406 switch (MI->getOpcode()) { 1407 // SGPR register spill 1408 case AMDGPU::SI_SPILL_S1024_SAVE: 1409 case AMDGPU::SI_SPILL_S512_SAVE: 1410 case AMDGPU::SI_SPILL_S256_SAVE: 1411 case AMDGPU::SI_SPILL_S192_SAVE: 1412 case AMDGPU::SI_SPILL_S160_SAVE: 1413 case AMDGPU::SI_SPILL_S128_SAVE: 1414 case AMDGPU::SI_SPILL_S96_SAVE: 1415 case AMDGPU::SI_SPILL_S64_SAVE: 1416 case AMDGPU::SI_SPILL_S32_SAVE: { 1417 spillSGPR(MI, Index, RS); 1418 break; 1419 } 1420 1421 // SGPR register restore 1422 case AMDGPU::SI_SPILL_S1024_RESTORE: 1423 case AMDGPU::SI_SPILL_S512_RESTORE: 1424 case AMDGPU::SI_SPILL_S256_RESTORE: 1425 case AMDGPU::SI_SPILL_S192_RESTORE: 1426 case AMDGPU::SI_SPILL_S160_RESTORE: 1427 case AMDGPU::SI_SPILL_S128_RESTORE: 1428 case AMDGPU::SI_SPILL_S96_RESTORE: 1429 case AMDGPU::SI_SPILL_S64_RESTORE: 1430 case AMDGPU::SI_SPILL_S32_RESTORE: { 1431 restoreSGPR(MI, Index, RS); 1432 break; 1433 } 1434 1435 // VGPR register spill 1436 case AMDGPU::SI_SPILL_V1024_SAVE: 1437 case AMDGPU::SI_SPILL_V512_SAVE: 1438 case AMDGPU::SI_SPILL_V256_SAVE: 1439 case AMDGPU::SI_SPILL_V192_SAVE: 1440 case AMDGPU::SI_SPILL_V160_SAVE: 1441 case AMDGPU::SI_SPILL_V128_SAVE: 1442 case AMDGPU::SI_SPILL_V96_SAVE: 1443 case AMDGPU::SI_SPILL_V64_SAVE: 1444 case AMDGPU::SI_SPILL_V32_SAVE: 1445 case AMDGPU::SI_SPILL_A1024_SAVE: 1446 case AMDGPU::SI_SPILL_A512_SAVE: 1447 case AMDGPU::SI_SPILL_A256_SAVE: 1448 case AMDGPU::SI_SPILL_A192_SAVE: 1449 case AMDGPU::SI_SPILL_A160_SAVE: 1450 case AMDGPU::SI_SPILL_A128_SAVE: 1451 case AMDGPU::SI_SPILL_A96_SAVE: 1452 case AMDGPU::SI_SPILL_A64_SAVE: 1453 case AMDGPU::SI_SPILL_A32_SAVE: { 1454 const MachineOperand *VData = TII->getNamedOperand(*MI, 1455 AMDGPU::OpName::vdata); 1456 assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() == 1457 MFI->getStackPtrOffsetReg()); 1458 1459 unsigned Opc = ST.enableFlatScratch() ? AMDGPU::SCRATCH_STORE_DWORD_SADDR 1460 : AMDGPU::BUFFER_STORE_DWORD_OFFSET; 1461 buildSpillLoadStore(MI, Opc, 1462 Index, 1463 VData->getReg(), VData->isKill(), 1464 FrameReg, 1465 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), 1466 *MI->memoperands_begin(), 1467 RS); 1468 MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode())); 1469 MI->eraseFromParent(); 1470 break; 1471 } 1472 case AMDGPU::SI_SPILL_V32_RESTORE: 1473 case AMDGPU::SI_SPILL_V64_RESTORE: 1474 case AMDGPU::SI_SPILL_V96_RESTORE: 1475 case AMDGPU::SI_SPILL_V128_RESTORE: 1476 case AMDGPU::SI_SPILL_V160_RESTORE: 1477 case AMDGPU::SI_SPILL_V192_RESTORE: 1478 case AMDGPU::SI_SPILL_V256_RESTORE: 1479 case AMDGPU::SI_SPILL_V512_RESTORE: 1480 case AMDGPU::SI_SPILL_V1024_RESTORE: 1481 case AMDGPU::SI_SPILL_A32_RESTORE: 1482 case AMDGPU::SI_SPILL_A64_RESTORE: 1483 case AMDGPU::SI_SPILL_A96_RESTORE: 1484 case AMDGPU::SI_SPILL_A128_RESTORE: 1485 case AMDGPU::SI_SPILL_A160_RESTORE: 1486 case AMDGPU::SI_SPILL_A192_RESTORE: 1487 case AMDGPU::SI_SPILL_A256_RESTORE: 1488 case AMDGPU::SI_SPILL_A512_RESTORE: 1489 case AMDGPU::SI_SPILL_A1024_RESTORE: { 1490 const MachineOperand *VData = TII->getNamedOperand(*MI, 1491 AMDGPU::OpName::vdata); 1492 assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() == 1493 MFI->getStackPtrOffsetReg()); 1494 1495 unsigned Opc = ST.enableFlatScratch() ? AMDGPU::SCRATCH_LOAD_DWORD_SADDR 1496 : AMDGPU::BUFFER_LOAD_DWORD_OFFSET; 1497 buildSpillLoadStore(MI, Opc, 1498 Index, 1499 VData->getReg(), VData->isKill(), 1500 FrameReg, 1501 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), 1502 *MI->memoperands_begin(), 1503 RS); 1504 MI->eraseFromParent(); 1505 break; 1506 } 1507 1508 default: { 1509 const DebugLoc &DL = MI->getDebugLoc(); 1510 1511 int64_t Offset = FrameInfo.getObjectOffset(Index); 1512 if (ST.enableFlatScratch()) { 1513 if (TII->isFLATScratch(*MI)) { 1514 assert((int16_t)FIOperandNum == 1515 AMDGPU::getNamedOperandIdx(MI->getOpcode(), 1516 AMDGPU::OpName::saddr)); 1517 1518 // The offset is always swizzled, just replace it 1519 if (FrameReg) 1520 FIOp.ChangeToRegister(FrameReg, false); 1521 1522 if (!Offset) 1523 return; 1524 1525 MachineOperand *OffsetOp = 1526 TII->getNamedOperand(*MI, AMDGPU::OpName::offset); 1527 int64_t NewOffset = Offset + OffsetOp->getImm(); 1528 if (TII->isLegalFLATOffset(NewOffset, AMDGPUAS::PRIVATE_ADDRESS, 1529 SIInstrFlags::FlatScratch)) { 1530 OffsetOp->setImm(NewOffset); 1531 if (FrameReg) 1532 return; 1533 Offset = 0; 1534 } 1535 1536 assert(!TII->getNamedOperand(*MI, AMDGPU::OpName::vaddr) && 1537 "Unexpected vaddr for flat scratch with a FI operand"); 1538 1539 // On GFX10 we have ST mode to use no registers for an address. 1540 // Otherwise we need to materialize 0 into an SGPR. 1541 if (!Offset && ST.hasFlatScratchSTMode()) { 1542 unsigned Opc = MI->getOpcode(); 1543 unsigned NewOpc = AMDGPU::getFlatScratchInstSTfromSS(Opc); 1544 MI->RemoveOperand( 1545 AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::saddr)); 1546 MI->setDesc(TII->get(NewOpc)); 1547 return; 1548 } 1549 } 1550 1551 if (!FrameReg) { 1552 FIOp.ChangeToImmediate(Offset); 1553 if (TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) 1554 return; 1555 } 1556 1557 // We need to use register here. Check if we can use an SGPR or need 1558 // a VGPR. 1559 FIOp.ChangeToRegister(AMDGPU::M0, false); 1560 bool UseSGPR = TII->isOperandLegal(*MI, FIOperandNum, &FIOp); 1561 1562 if (!Offset && FrameReg && UseSGPR) { 1563 FIOp.setReg(FrameReg); 1564 return; 1565 } 1566 1567 const TargetRegisterClass *RC = UseSGPR ? &AMDGPU::SReg_32_XM0RegClass 1568 : &AMDGPU::VGPR_32RegClass; 1569 1570 Register TmpReg = RS->scavengeRegister(RC, MI, 0, !UseSGPR); 1571 FIOp.setReg(TmpReg); 1572 FIOp.setIsKill(true); 1573 1574 if ((!FrameReg || !Offset) && TmpReg) { 1575 unsigned Opc = UseSGPR ? AMDGPU::S_MOV_B32 : AMDGPU::V_MOV_B32_e32; 1576 auto MIB = BuildMI(*MBB, MI, DL, TII->get(Opc), TmpReg); 1577 if (FrameReg) 1578 MIB.addReg(FrameReg); 1579 else 1580 MIB.addImm(Offset); 1581 1582 return; 1583 } 1584 1585 Register TmpSReg = 1586 UseSGPR ? TmpReg 1587 : RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MI, 0, 1588 !UseSGPR); 1589 1590 // TODO: for flat scratch another attempt can be made with a VGPR index 1591 // if no SGPRs can be scavenged. 1592 if ((!TmpSReg && !FrameReg) || (!TmpReg && !UseSGPR)) 1593 report_fatal_error("Cannot scavenge register in FI elimination!"); 1594 1595 if (!TmpSReg) { 1596 // Use frame register and restore it after. 1597 TmpSReg = FrameReg; 1598 FIOp.setReg(FrameReg); 1599 FIOp.setIsKill(false); 1600 } 1601 1602 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), TmpSReg) 1603 .addReg(FrameReg) 1604 .addImm(Offset); 1605 1606 if (!UseSGPR) 1607 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 1608 .addReg(TmpSReg, RegState::Kill); 1609 1610 if (TmpSReg == FrameReg) { 1611 // Undo frame register modification. 1612 BuildMI(*MBB, std::next(MI), DL, TII->get(AMDGPU::S_SUB_U32), 1613 FrameReg) 1614 .addReg(FrameReg) 1615 .addImm(Offset); 1616 } 1617 1618 return; 1619 } 1620 1621 bool IsMUBUF = TII->isMUBUF(*MI); 1622 1623 if (!IsMUBUF && !MFI->isEntryFunction()) { 1624 // Convert to a swizzled stack address by scaling by the wave size. 1625 // 1626 // In an entry function/kernel the offset is already swizzled. 1627 1628 bool IsCopy = MI->getOpcode() == AMDGPU::V_MOV_B32_e32; 1629 Register ResultReg = 1630 IsCopy ? MI->getOperand(0).getReg() 1631 : RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 1632 1633 int64_t Offset = FrameInfo.getObjectOffset(Index); 1634 if (Offset == 0) { 1635 // XXX - This never happens because of emergency scavenging slot at 0? 1636 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ResultReg) 1637 .addImm(ST.getWavefrontSizeLog2()) 1638 .addReg(FrameReg); 1639 } else { 1640 if (auto MIB = TII->getAddNoCarry(*MBB, MI, DL, ResultReg, *RS)) { 1641 // Reuse ResultReg in intermediate step. 1642 Register ScaledReg = ResultReg; 1643 1644 BuildMI(*MBB, *MIB, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), 1645 ScaledReg) 1646 .addImm(ST.getWavefrontSizeLog2()) 1647 .addReg(FrameReg); 1648 1649 const bool IsVOP2 = MIB->getOpcode() == AMDGPU::V_ADD_U32_e32; 1650 1651 // TODO: Fold if use instruction is another add of a constant. 1652 if (IsVOP2 || AMDGPU::isInlinableLiteral32(Offset, ST.hasInv2PiInlineImm())) { 1653 // FIXME: This can fail 1654 MIB.addImm(Offset); 1655 MIB.addReg(ScaledReg, RegState::Kill); 1656 if (!IsVOP2) 1657 MIB.addImm(0); // clamp bit 1658 } else { 1659 assert(MIB->getOpcode() == AMDGPU::V_ADD_CO_U32_e64 && 1660 "Need to reuse carry out register"); 1661 1662 // Use scavenged unused carry out as offset register. 1663 Register ConstOffsetReg; 1664 if (!isWave32) 1665 ConstOffsetReg = getSubReg(MIB.getReg(1), AMDGPU::sub0); 1666 else 1667 ConstOffsetReg = MIB.getReg(1); 1668 1669 BuildMI(*MBB, *MIB, DL, TII->get(AMDGPU::S_MOV_B32), ConstOffsetReg) 1670 .addImm(Offset); 1671 MIB.addReg(ConstOffsetReg, RegState::Kill); 1672 MIB.addReg(ScaledReg, RegState::Kill); 1673 MIB.addImm(0); // clamp bit 1674 } 1675 } else { 1676 // We have to produce a carry out, and there isn't a free SGPR pair 1677 // for it. We can keep the whole computation on the SALU to avoid 1678 // clobbering an additional register at the cost of an extra mov. 1679 1680 // We may have 1 free scratch SGPR even though a carry out is 1681 // unavailable. Only one additional mov is needed. 1682 Register TmpScaledReg = 1683 RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MI, 0, false); 1684 Register ScaledReg = TmpScaledReg.isValid() ? TmpScaledReg : FrameReg; 1685 1686 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_LSHR_B32), ScaledReg) 1687 .addReg(FrameReg) 1688 .addImm(ST.getWavefrontSizeLog2()); 1689 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), ScaledReg) 1690 .addReg(ScaledReg, RegState::Kill) 1691 .addImm(Offset); 1692 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), ResultReg) 1693 .addReg(ScaledReg, RegState::Kill); 1694 1695 // If there were truly no free SGPRs, we need to undo everything. 1696 if (!TmpScaledReg.isValid()) { 1697 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScaledReg) 1698 .addReg(ScaledReg, RegState::Kill) 1699 .addImm(Offset); 1700 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_LSHL_B32), ScaledReg) 1701 .addReg(FrameReg) 1702 .addImm(ST.getWavefrontSizeLog2()); 1703 } 1704 } 1705 } 1706 1707 // Don't introduce an extra copy if we're just materializing in a mov. 1708 if (IsCopy) 1709 MI->eraseFromParent(); 1710 else 1711 FIOp.ChangeToRegister(ResultReg, false, false, true); 1712 return; 1713 } 1714 1715 if (IsMUBUF) { 1716 // Disable offen so we don't need a 0 vgpr base. 1717 assert(static_cast<int>(FIOperandNum) == 1718 AMDGPU::getNamedOperandIdx(MI->getOpcode(), 1719 AMDGPU::OpName::vaddr)); 1720 1721 auto &SOffset = *TII->getNamedOperand(*MI, AMDGPU::OpName::soffset); 1722 assert((SOffset.isImm() && SOffset.getImm() == 0)); 1723 1724 if (FrameReg != AMDGPU::NoRegister) 1725 SOffset.ChangeToRegister(FrameReg, false); 1726 1727 int64_t Offset = FrameInfo.getObjectOffset(Index); 1728 int64_t OldImm 1729 = TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(); 1730 int64_t NewOffset = OldImm + Offset; 1731 1732 if (SIInstrInfo::isLegalMUBUFImmOffset(NewOffset) && 1733 buildMUBUFOffsetLoadStore(ST, FrameInfo, MI, Index, NewOffset)) { 1734 MI->eraseFromParent(); 1735 return; 1736 } 1737 } 1738 1739 // If the offset is simply too big, don't convert to a scratch wave offset 1740 // relative index. 1741 1742 FIOp.ChangeToImmediate(Offset); 1743 if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) { 1744 Register TmpReg = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 1745 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 1746 .addImm(Offset); 1747 FIOp.ChangeToRegister(TmpReg, false, false, true); 1748 } 1749 } 1750 } 1751 } 1752 1753 StringRef SIRegisterInfo::getRegAsmName(MCRegister Reg) const { 1754 return AMDGPUInstPrinter::getRegisterName(Reg); 1755 } 1756 1757 static const TargetRegisterClass * 1758 getAnyVGPRClassForBitWidth(unsigned BitWidth) { 1759 if (BitWidth <= 64) 1760 return &AMDGPU::VReg_64RegClass; 1761 if (BitWidth <= 96) 1762 return &AMDGPU::VReg_96RegClass; 1763 if (BitWidth <= 128) 1764 return &AMDGPU::VReg_128RegClass; 1765 if (BitWidth <= 160) 1766 return &AMDGPU::VReg_160RegClass; 1767 if (BitWidth <= 192) 1768 return &AMDGPU::VReg_192RegClass; 1769 if (BitWidth <= 256) 1770 return &AMDGPU::VReg_256RegClass; 1771 if (BitWidth <= 512) 1772 return &AMDGPU::VReg_512RegClass; 1773 if (BitWidth <= 1024) 1774 return &AMDGPU::VReg_1024RegClass; 1775 1776 return nullptr; 1777 } 1778 1779 static const TargetRegisterClass * 1780 getAlignedVGPRClassForBitWidth(unsigned BitWidth) { 1781 if (BitWidth <= 64) 1782 return &AMDGPU::VReg_64_Align2RegClass; 1783 if (BitWidth <= 96) 1784 return &AMDGPU::VReg_96_Align2RegClass; 1785 if (BitWidth <= 128) 1786 return &AMDGPU::VReg_128_Align2RegClass; 1787 if (BitWidth <= 160) 1788 return &AMDGPU::VReg_160_Align2RegClass; 1789 if (BitWidth <= 192) 1790 return &AMDGPU::VReg_192_Align2RegClass; 1791 if (BitWidth <= 256) 1792 return &AMDGPU::VReg_256_Align2RegClass; 1793 if (BitWidth <= 512) 1794 return &AMDGPU::VReg_512_Align2RegClass; 1795 if (BitWidth <= 1024) 1796 return &AMDGPU::VReg_1024_Align2RegClass; 1797 1798 return nullptr; 1799 } 1800 1801 const TargetRegisterClass * 1802 SIRegisterInfo::getVGPRClassForBitWidth(unsigned BitWidth) const { 1803 if (BitWidth == 1) 1804 return &AMDGPU::VReg_1RegClass; 1805 if (BitWidth <= 16) 1806 return &AMDGPU::VGPR_LO16RegClass; 1807 if (BitWidth <= 32) 1808 return &AMDGPU::VGPR_32RegClass; 1809 return ST.needsAlignedVGPRs() ? getAlignedVGPRClassForBitWidth(BitWidth) 1810 : getAnyVGPRClassForBitWidth(BitWidth); 1811 } 1812 1813 static const TargetRegisterClass * 1814 getAnyAGPRClassForBitWidth(unsigned BitWidth) { 1815 if (BitWidth <= 64) 1816 return &AMDGPU::AReg_64RegClass; 1817 if (BitWidth <= 96) 1818 return &AMDGPU::AReg_96RegClass; 1819 if (BitWidth <= 128) 1820 return &AMDGPU::AReg_128RegClass; 1821 if (BitWidth <= 160) 1822 return &AMDGPU::AReg_160RegClass; 1823 if (BitWidth <= 192) 1824 return &AMDGPU::AReg_192RegClass; 1825 if (BitWidth <= 256) 1826 return &AMDGPU::AReg_256RegClass; 1827 if (BitWidth <= 512) 1828 return &AMDGPU::AReg_512RegClass; 1829 if (BitWidth <= 1024) 1830 return &AMDGPU::AReg_1024RegClass; 1831 1832 return nullptr; 1833 } 1834 1835 static const TargetRegisterClass * 1836 getAlignedAGPRClassForBitWidth(unsigned BitWidth) { 1837 if (BitWidth <= 64) 1838 return &AMDGPU::AReg_64_Align2RegClass; 1839 if (BitWidth <= 96) 1840 return &AMDGPU::AReg_96_Align2RegClass; 1841 if (BitWidth <= 128) 1842 return &AMDGPU::AReg_128_Align2RegClass; 1843 if (BitWidth <= 160) 1844 return &AMDGPU::AReg_160_Align2RegClass; 1845 if (BitWidth <= 192) 1846 return &AMDGPU::AReg_192_Align2RegClass; 1847 if (BitWidth <= 256) 1848 return &AMDGPU::AReg_256_Align2RegClass; 1849 if (BitWidth <= 512) 1850 return &AMDGPU::AReg_512_Align2RegClass; 1851 if (BitWidth <= 1024) 1852 return &AMDGPU::AReg_1024_Align2RegClass; 1853 1854 return nullptr; 1855 } 1856 1857 const TargetRegisterClass * 1858 SIRegisterInfo::getAGPRClassForBitWidth(unsigned BitWidth) const { 1859 if (BitWidth <= 16) 1860 return &AMDGPU::AGPR_LO16RegClass; 1861 if (BitWidth <= 32) 1862 return &AMDGPU::AGPR_32RegClass; 1863 return ST.needsAlignedVGPRs() ? getAlignedAGPRClassForBitWidth(BitWidth) 1864 : getAnyAGPRClassForBitWidth(BitWidth); 1865 } 1866 1867 const TargetRegisterClass * 1868 SIRegisterInfo::getSGPRClassForBitWidth(unsigned BitWidth) { 1869 if (BitWidth <= 16) 1870 return &AMDGPU::SGPR_LO16RegClass; 1871 if (BitWidth <= 32) 1872 return &AMDGPU::SReg_32RegClass; 1873 if (BitWidth <= 64) 1874 return &AMDGPU::SReg_64RegClass; 1875 if (BitWidth <= 96) 1876 return &AMDGPU::SGPR_96RegClass; 1877 if (BitWidth <= 128) 1878 return &AMDGPU::SGPR_128RegClass; 1879 if (BitWidth <= 160) 1880 return &AMDGPU::SGPR_160RegClass; 1881 if (BitWidth <= 192) 1882 return &AMDGPU::SGPR_192RegClass; 1883 if (BitWidth <= 256) 1884 return &AMDGPU::SGPR_256RegClass; 1885 if (BitWidth <= 512) 1886 return &AMDGPU::SGPR_512RegClass; 1887 if (BitWidth <= 1024) 1888 return &AMDGPU::SGPR_1024RegClass; 1889 1890 return nullptr; 1891 } 1892 1893 // FIXME: This is very slow. It might be worth creating a map from physreg to 1894 // register class. 1895 const TargetRegisterClass * 1896 SIRegisterInfo::getPhysRegClass(MCRegister Reg) const { 1897 static const TargetRegisterClass *const BaseClasses[] = { 1898 &AMDGPU::VGPR_LO16RegClass, 1899 &AMDGPU::VGPR_HI16RegClass, 1900 &AMDGPU::SReg_LO16RegClass, 1901 &AMDGPU::AGPR_LO16RegClass, 1902 &AMDGPU::VGPR_32RegClass, 1903 &AMDGPU::SReg_32RegClass, 1904 &AMDGPU::AGPR_32RegClass, 1905 &AMDGPU::AGPR_32RegClass, 1906 &AMDGPU::VReg_64_Align2RegClass, 1907 &AMDGPU::VReg_64RegClass, 1908 &AMDGPU::SReg_64RegClass, 1909 &AMDGPU::AReg_64_Align2RegClass, 1910 &AMDGPU::AReg_64RegClass, 1911 &AMDGPU::VReg_96_Align2RegClass, 1912 &AMDGPU::VReg_96RegClass, 1913 &AMDGPU::SReg_96RegClass, 1914 &AMDGPU::AReg_96_Align2RegClass, 1915 &AMDGPU::AReg_96RegClass, 1916 &AMDGPU::VReg_128_Align2RegClass, 1917 &AMDGPU::VReg_128RegClass, 1918 &AMDGPU::SReg_128RegClass, 1919 &AMDGPU::AReg_128_Align2RegClass, 1920 &AMDGPU::AReg_128RegClass, 1921 &AMDGPU::VReg_160_Align2RegClass, 1922 &AMDGPU::VReg_160RegClass, 1923 &AMDGPU::SReg_160RegClass, 1924 &AMDGPU::AReg_160_Align2RegClass, 1925 &AMDGPU::AReg_160RegClass, 1926 &AMDGPU::VReg_192_Align2RegClass, 1927 &AMDGPU::VReg_192RegClass, 1928 &AMDGPU::SReg_192RegClass, 1929 &AMDGPU::AReg_192_Align2RegClass, 1930 &AMDGPU::AReg_192RegClass, 1931 &AMDGPU::VReg_256_Align2RegClass, 1932 &AMDGPU::VReg_256RegClass, 1933 &AMDGPU::SReg_256RegClass, 1934 &AMDGPU::AReg_256_Align2RegClass, 1935 &AMDGPU::AReg_256RegClass, 1936 &AMDGPU::VReg_512_Align2RegClass, 1937 &AMDGPU::VReg_512RegClass, 1938 &AMDGPU::SReg_512RegClass, 1939 &AMDGPU::AReg_512_Align2RegClass, 1940 &AMDGPU::AReg_512RegClass, 1941 &AMDGPU::SReg_1024RegClass, 1942 &AMDGPU::VReg_1024_Align2RegClass, 1943 &AMDGPU::VReg_1024RegClass, 1944 &AMDGPU::AReg_1024_Align2RegClass, 1945 &AMDGPU::AReg_1024RegClass, 1946 &AMDGPU::SCC_CLASSRegClass, 1947 &AMDGPU::Pseudo_SReg_32RegClass, 1948 &AMDGPU::Pseudo_SReg_128RegClass, 1949 }; 1950 1951 for (const TargetRegisterClass *BaseClass : BaseClasses) { 1952 if (BaseClass->contains(Reg)) { 1953 return BaseClass; 1954 } 1955 } 1956 return nullptr; 1957 } 1958 1959 bool SIRegisterInfo::isSGPRReg(const MachineRegisterInfo &MRI, 1960 Register Reg) const { 1961 const TargetRegisterClass *RC; 1962 if (Reg.isVirtual()) 1963 RC = MRI.getRegClass(Reg); 1964 else 1965 RC = getPhysRegClass(Reg); 1966 return isSGPRClass(RC); 1967 } 1968 1969 // TODO: It might be helpful to have some target specific flags in 1970 // TargetRegisterClass to mark which classes are VGPRs to make this trivial. 1971 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const { 1972 unsigned Size = getRegSizeInBits(*RC); 1973 if (Size == 16) { 1974 return getCommonSubClass(&AMDGPU::VGPR_LO16RegClass, RC) != nullptr || 1975 getCommonSubClass(&AMDGPU::VGPR_HI16RegClass, RC) != nullptr; 1976 } 1977 const TargetRegisterClass *VRC = getVGPRClassForBitWidth(Size); 1978 if (!VRC) { 1979 assert(Size < 32 && "Invalid register class size"); 1980 return false; 1981 } 1982 return getCommonSubClass(VRC, RC) != nullptr; 1983 } 1984 1985 bool SIRegisterInfo::hasAGPRs(const TargetRegisterClass *RC) const { 1986 unsigned Size = getRegSizeInBits(*RC); 1987 if (Size < 16) 1988 return false; 1989 const TargetRegisterClass *ARC = getAGPRClassForBitWidth(Size); 1990 if (!ARC) { 1991 assert(getVGPRClassForBitWidth(Size) && "Invalid register class size"); 1992 return false; 1993 } 1994 return getCommonSubClass(ARC, RC) != nullptr; 1995 } 1996 1997 const TargetRegisterClass * 1998 SIRegisterInfo::getEquivalentVGPRClass(const TargetRegisterClass *SRC) const { 1999 unsigned Size = getRegSizeInBits(*SRC); 2000 const TargetRegisterClass *VRC = getVGPRClassForBitWidth(Size); 2001 assert(VRC && "Invalid register class size"); 2002 return VRC; 2003 } 2004 2005 const TargetRegisterClass * 2006 SIRegisterInfo::getEquivalentAGPRClass(const TargetRegisterClass *SRC) const { 2007 unsigned Size = getRegSizeInBits(*SRC); 2008 const TargetRegisterClass *ARC = getAGPRClassForBitWidth(Size); 2009 assert(ARC && "Invalid register class size"); 2010 return ARC; 2011 } 2012 2013 const TargetRegisterClass * 2014 SIRegisterInfo::getEquivalentSGPRClass(const TargetRegisterClass *VRC) const { 2015 unsigned Size = getRegSizeInBits(*VRC); 2016 if (Size == 32) 2017 return &AMDGPU::SGPR_32RegClass; 2018 const TargetRegisterClass *SRC = getSGPRClassForBitWidth(Size); 2019 assert(SRC && "Invalid register class size"); 2020 return SRC; 2021 } 2022 2023 const TargetRegisterClass *SIRegisterInfo::getSubRegClass( 2024 const TargetRegisterClass *RC, unsigned SubIdx) const { 2025 if (SubIdx == AMDGPU::NoSubRegister) 2026 return RC; 2027 2028 // We can assume that each lane corresponds to one 32-bit register. 2029 unsigned Size = getNumChannelsFromSubReg(SubIdx) * 32; 2030 if (isSGPRClass(RC)) { 2031 if (Size == 32) 2032 RC = &AMDGPU::SGPR_32RegClass; 2033 else 2034 RC = getSGPRClassForBitWidth(Size); 2035 } else if (hasAGPRs(RC)) { 2036 RC = getAGPRClassForBitWidth(Size); 2037 } else { 2038 RC = getVGPRClassForBitWidth(Size); 2039 } 2040 assert(RC && "Invalid sub-register class size"); 2041 return RC; 2042 } 2043 2044 const TargetRegisterClass * 2045 SIRegisterInfo::getCompatibleSubRegClass(const TargetRegisterClass *SuperRC, 2046 const TargetRegisterClass *SubRC, 2047 unsigned SubIdx) const { 2048 // Ensure this subregister index is aligned in the super register. 2049 const TargetRegisterClass *MatchRC = 2050 getMatchingSuperRegClass(SuperRC, SubRC, SubIdx); 2051 return MatchRC && MatchRC->hasSubClassEq(SuperRC) ? MatchRC : nullptr; 2052 } 2053 2054 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const { 2055 if (OpType >= AMDGPU::OPERAND_REG_INLINE_AC_FIRST && 2056 OpType <= AMDGPU::OPERAND_REG_INLINE_AC_LAST) 2057 return !ST.hasMFMAInlineLiteralBug(); 2058 2059 return OpType >= AMDGPU::OPERAND_SRC_FIRST && 2060 OpType <= AMDGPU::OPERAND_SRC_LAST; 2061 } 2062 2063 bool SIRegisterInfo::shouldRewriteCopySrc( 2064 const TargetRegisterClass *DefRC, 2065 unsigned DefSubReg, 2066 const TargetRegisterClass *SrcRC, 2067 unsigned SrcSubReg) const { 2068 // We want to prefer the smallest register class possible, so we don't want to 2069 // stop and rewrite on anything that looks like a subregister 2070 // extract. Operations mostly don't care about the super register class, so we 2071 // only want to stop on the most basic of copies between the same register 2072 // class. 2073 // 2074 // e.g. if we have something like 2075 // %0 = ... 2076 // %1 = ... 2077 // %2 = REG_SEQUENCE %0, sub0, %1, sub1, %2, sub2 2078 // %3 = COPY %2, sub0 2079 // 2080 // We want to look through the COPY to find: 2081 // => %3 = COPY %0 2082 2083 // Plain copy. 2084 return getCommonSubClass(DefRC, SrcRC) != nullptr; 2085 } 2086 2087 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const { 2088 // TODO: 64-bit operands have extending behavior from 32-bit literal. 2089 return OpType >= AMDGPU::OPERAND_REG_IMM_FIRST && 2090 OpType <= AMDGPU::OPERAND_REG_IMM_LAST; 2091 } 2092 2093 /// Returns a lowest register that is not used at any point in the function. 2094 /// If all registers are used, then this function will return 2095 /// AMDGPU::NoRegister. If \p ReserveHighestVGPR = true, then return 2096 /// highest unused register. 2097 MCRegister SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI, 2098 const TargetRegisterClass *RC, 2099 const MachineFunction &MF, 2100 bool ReserveHighestVGPR) const { 2101 if (ReserveHighestVGPR) { 2102 for (MCRegister Reg : reverse(*RC)) 2103 if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg)) 2104 return Reg; 2105 } else { 2106 for (MCRegister Reg : *RC) 2107 if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg)) 2108 return Reg; 2109 } 2110 return MCRegister(); 2111 } 2112 2113 ArrayRef<int16_t> SIRegisterInfo::getRegSplitParts(const TargetRegisterClass *RC, 2114 unsigned EltSize) const { 2115 const unsigned RegBitWidth = AMDGPU::getRegBitWidth(*RC->MC); 2116 assert(RegBitWidth >= 32 && RegBitWidth <= 1024); 2117 2118 const unsigned RegDWORDs = RegBitWidth / 32; 2119 const unsigned EltDWORDs = EltSize / 4; 2120 assert(RegSplitParts.size() + 1 >= EltDWORDs); 2121 2122 const std::vector<int16_t> &Parts = RegSplitParts[EltDWORDs - 1]; 2123 const unsigned NumParts = RegDWORDs / EltDWORDs; 2124 2125 return makeArrayRef(Parts.data(), NumParts); 2126 } 2127 2128 const TargetRegisterClass* 2129 SIRegisterInfo::getRegClassForReg(const MachineRegisterInfo &MRI, 2130 Register Reg) const { 2131 return Reg.isVirtual() ? MRI.getRegClass(Reg) : getPhysRegClass(Reg); 2132 } 2133 2134 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI, 2135 Register Reg) const { 2136 const TargetRegisterClass *RC = getRegClassForReg(MRI, Reg); 2137 // Registers without classes are unaddressable, SGPR-like registers. 2138 return RC && hasVGPRs(RC); 2139 } 2140 2141 bool SIRegisterInfo::isAGPR(const MachineRegisterInfo &MRI, 2142 Register Reg) const { 2143 const TargetRegisterClass *RC = getRegClassForReg(MRI, Reg); 2144 2145 // Registers without classes are unaddressable, SGPR-like registers. 2146 return RC && hasAGPRs(RC); 2147 } 2148 2149 bool SIRegisterInfo::shouldCoalesce(MachineInstr *MI, 2150 const TargetRegisterClass *SrcRC, 2151 unsigned SubReg, 2152 const TargetRegisterClass *DstRC, 2153 unsigned DstSubReg, 2154 const TargetRegisterClass *NewRC, 2155 LiveIntervals &LIS) const { 2156 unsigned SrcSize = getRegSizeInBits(*SrcRC); 2157 unsigned DstSize = getRegSizeInBits(*DstRC); 2158 unsigned NewSize = getRegSizeInBits(*NewRC); 2159 2160 // Do not increase size of registers beyond dword, we would need to allocate 2161 // adjacent registers and constraint regalloc more than needed. 2162 2163 // Always allow dword coalescing. 2164 if (SrcSize <= 32 || DstSize <= 32) 2165 return true; 2166 2167 return NewSize <= DstSize || NewSize <= SrcSize; 2168 } 2169 2170 unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, 2171 MachineFunction &MF) const { 2172 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 2173 2174 unsigned Occupancy = ST.getOccupancyWithLocalMemSize(MFI->getLDSSize(), 2175 MF.getFunction()); 2176 switch (RC->getID()) { 2177 default: 2178 return AMDGPUGenRegisterInfo::getRegPressureLimit(RC, MF); 2179 case AMDGPU::VGPR_32RegClassID: 2180 case AMDGPU::VGPR_LO16RegClassID: 2181 case AMDGPU::VGPR_HI16RegClassID: 2182 return std::min(ST.getMaxNumVGPRs(Occupancy), ST.getMaxNumVGPRs(MF)); 2183 case AMDGPU::SGPR_32RegClassID: 2184 case AMDGPU::SGPR_LO16RegClassID: 2185 return std::min(ST.getMaxNumSGPRs(Occupancy, true), ST.getMaxNumSGPRs(MF)); 2186 } 2187 } 2188 2189 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF, 2190 unsigned Idx) const { 2191 if (Idx == AMDGPU::RegisterPressureSets::VGPR_32 || 2192 Idx == AMDGPU::RegisterPressureSets::AGPR_32) 2193 return getRegPressureLimit(&AMDGPU::VGPR_32RegClass, 2194 const_cast<MachineFunction &>(MF)); 2195 2196 if (Idx == AMDGPU::RegisterPressureSets::SReg_32) 2197 return getRegPressureLimit(&AMDGPU::SGPR_32RegClass, 2198 const_cast<MachineFunction &>(MF)); 2199 2200 llvm_unreachable("Unexpected register pressure set!"); 2201 } 2202 2203 const int *SIRegisterInfo::getRegUnitPressureSets(unsigned RegUnit) const { 2204 static const int Empty[] = { -1 }; 2205 2206 if (RegPressureIgnoredUnits[RegUnit]) 2207 return Empty; 2208 2209 return AMDGPUGenRegisterInfo::getRegUnitPressureSets(RegUnit); 2210 } 2211 2212 MCRegister SIRegisterInfo::getReturnAddressReg(const MachineFunction &MF) const { 2213 // Not a callee saved register. 2214 return AMDGPU::SGPR30_SGPR31; 2215 } 2216 2217 const TargetRegisterClass * 2218 SIRegisterInfo::getRegClassForSizeOnBank(unsigned Size, 2219 const RegisterBank &RB, 2220 const MachineRegisterInfo &MRI) const { 2221 switch (RB.getID()) { 2222 case AMDGPU::VGPRRegBankID: 2223 return getVGPRClassForBitWidth(std::max(32u, Size)); 2224 case AMDGPU::VCCRegBankID: 2225 assert(Size == 1); 2226 return isWave32 ? &AMDGPU::SReg_32_XM0_XEXECRegClass 2227 : &AMDGPU::SReg_64_XEXECRegClass; 2228 case AMDGPU::SGPRRegBankID: 2229 return getSGPRClassForBitWidth(std::max(32u, Size)); 2230 case AMDGPU::AGPRRegBankID: 2231 return getAGPRClassForBitWidth(std::max(32u, Size)); 2232 default: 2233 llvm_unreachable("unknown register bank"); 2234 } 2235 } 2236 2237 const TargetRegisterClass * 2238 SIRegisterInfo::getConstrainedRegClassForOperand(const MachineOperand &MO, 2239 const MachineRegisterInfo &MRI) const { 2240 const RegClassOrRegBank &RCOrRB = MRI.getRegClassOrRegBank(MO.getReg()); 2241 if (const RegisterBank *RB = RCOrRB.dyn_cast<const RegisterBank*>()) 2242 return getRegClassForTypeOnBank(MRI.getType(MO.getReg()), *RB, MRI); 2243 2244 const TargetRegisterClass *RC = RCOrRB.get<const TargetRegisterClass*>(); 2245 return getAllocatableClass(RC); 2246 } 2247 2248 MCRegister SIRegisterInfo::getVCC() const { 2249 return isWave32 ? AMDGPU::VCC_LO : AMDGPU::VCC; 2250 } 2251 2252 const TargetRegisterClass *SIRegisterInfo::getVGPR64Class() const { 2253 // VGPR tuples have an alignment requirement on gfx90a variants. 2254 return ST.needsAlignedVGPRs() ? &AMDGPU::VReg_64_Align2RegClass 2255 : &AMDGPU::VReg_64RegClass; 2256 } 2257 2258 const TargetRegisterClass * 2259 SIRegisterInfo::getRegClass(unsigned RCID) const { 2260 switch ((int)RCID) { 2261 case AMDGPU::SReg_1RegClassID: 2262 return getBoolRC(); 2263 case AMDGPU::SReg_1_XEXECRegClassID: 2264 return isWave32 ? &AMDGPU::SReg_32_XM0_XEXECRegClass 2265 : &AMDGPU::SReg_64_XEXECRegClass; 2266 case -1: 2267 return nullptr; 2268 default: 2269 return AMDGPUGenRegisterInfo::getRegClass(RCID); 2270 } 2271 } 2272 2273 // Find reaching register definition 2274 MachineInstr *SIRegisterInfo::findReachingDef(Register Reg, unsigned SubReg, 2275 MachineInstr &Use, 2276 MachineRegisterInfo &MRI, 2277 LiveIntervals *LIS) const { 2278 auto &MDT = LIS->getAnalysis<MachineDominatorTree>(); 2279 SlotIndex UseIdx = LIS->getInstructionIndex(Use); 2280 SlotIndex DefIdx; 2281 2282 if (Reg.isVirtual()) { 2283 if (!LIS->hasInterval(Reg)) 2284 return nullptr; 2285 LiveInterval &LI = LIS->getInterval(Reg); 2286 LaneBitmask SubLanes = SubReg ? getSubRegIndexLaneMask(SubReg) 2287 : MRI.getMaxLaneMaskForVReg(Reg); 2288 VNInfo *V = nullptr; 2289 if (LI.hasSubRanges()) { 2290 for (auto &S : LI.subranges()) { 2291 if ((S.LaneMask & SubLanes) == SubLanes) { 2292 V = S.getVNInfoAt(UseIdx); 2293 break; 2294 } 2295 } 2296 } else { 2297 V = LI.getVNInfoAt(UseIdx); 2298 } 2299 if (!V) 2300 return nullptr; 2301 DefIdx = V->def; 2302 } else { 2303 // Find last def. 2304 for (MCRegUnitIterator Units(Reg.asMCReg(), this); Units.isValid(); 2305 ++Units) { 2306 LiveRange &LR = LIS->getRegUnit(*Units); 2307 if (VNInfo *V = LR.getVNInfoAt(UseIdx)) { 2308 if (!DefIdx.isValid() || 2309 MDT.dominates(LIS->getInstructionFromIndex(DefIdx), 2310 LIS->getInstructionFromIndex(V->def))) 2311 DefIdx = V->def; 2312 } else { 2313 return nullptr; 2314 } 2315 } 2316 } 2317 2318 MachineInstr *Def = LIS->getInstructionFromIndex(DefIdx); 2319 2320 if (!Def || !MDT.dominates(Def, &Use)) 2321 return nullptr; 2322 2323 assert(Def->modifiesRegister(Reg, this)); 2324 2325 return Def; 2326 } 2327 2328 MCPhysReg SIRegisterInfo::get32BitRegister(MCPhysReg Reg) const { 2329 assert(getRegSizeInBits(*getPhysRegClass(Reg)) <= 32); 2330 2331 for (const TargetRegisterClass &RC : { AMDGPU::VGPR_32RegClass, 2332 AMDGPU::SReg_32RegClass, 2333 AMDGPU::AGPR_32RegClass } ) { 2334 if (MCPhysReg Super = getMatchingSuperReg(Reg, AMDGPU::lo16, &RC)) 2335 return Super; 2336 } 2337 if (MCPhysReg Super = getMatchingSuperReg(Reg, AMDGPU::hi16, 2338 &AMDGPU::VGPR_32RegClass)) { 2339 return Super; 2340 } 2341 2342 return AMDGPU::NoRegister; 2343 } 2344 2345 bool SIRegisterInfo::isProperlyAlignedRC(const TargetRegisterClass &RC) const { 2346 if (!ST.needsAlignedVGPRs()) 2347 return true; 2348 2349 if (hasVGPRs(&RC)) 2350 return RC.hasSuperClassEq(getVGPRClassForBitWidth(getRegSizeInBits(RC))); 2351 if (hasAGPRs(&RC)) 2352 return RC.hasSuperClassEq(getAGPRClassForBitWidth(getRegSizeInBits(RC))); 2353 2354 return true; 2355 } 2356 2357 bool SIRegisterInfo::isConstantPhysReg(MCRegister PhysReg) const { 2358 switch (PhysReg) { 2359 case AMDGPU::SGPR_NULL: 2360 case AMDGPU::SRC_SHARED_BASE: 2361 case AMDGPU::SRC_PRIVATE_BASE: 2362 case AMDGPU::SRC_SHARED_LIMIT: 2363 case AMDGPU::SRC_PRIVATE_LIMIT: 2364 return true; 2365 default: 2366 return false; 2367 } 2368 } 2369 2370 ArrayRef<MCPhysReg> 2371 SIRegisterInfo::getAllSGPR128(const MachineFunction &MF) const { 2372 return makeArrayRef(AMDGPU::SGPR_128RegClass.begin(), 2373 ST.getMaxNumSGPRs(MF) / 4); 2374 } 2375 2376 ArrayRef<MCPhysReg> 2377 SIRegisterInfo::getAllSGPR64(const MachineFunction &MF) const { 2378 return makeArrayRef(AMDGPU::SGPR_64RegClass.begin(), 2379 ST.getMaxNumSGPRs(MF) / 2); 2380 } 2381 2382 ArrayRef<MCPhysReg> 2383 SIRegisterInfo::getAllSGPR32(const MachineFunction &MF) const { 2384 return makeArrayRef(AMDGPU::SGPR_32RegClass.begin(), ST.getMaxNumSGPRs(MF)); 2385 } 2386