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