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