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