1 //===----------------------- SIFrameLowering.cpp --------------------------===// 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 #include "SIFrameLowering.h" 10 #include "AMDGPU.h" 11 #include "GCNSubtarget.h" 12 #include "MCTargetDesc/AMDGPUMCTargetDesc.h" 13 #include "SIMachineFunctionInfo.h" 14 #include "llvm/CodeGen/LivePhysRegs.h" 15 #include "llvm/CodeGen/MachineFrameInfo.h" 16 #include "llvm/CodeGen/RegisterScavenging.h" 17 #include "llvm/Target/TargetMachine.h" 18 19 using namespace llvm; 20 21 #define DEBUG_TYPE "frame-info" 22 23 // Find a scratch register that we can use in the prologue. We avoid using 24 // callee-save registers since they may appear to be free when this is called 25 // from canUseAsPrologue (during shrink wrapping), but then no longer be free 26 // when this is called from emitPrologue. 27 static MCRegister findScratchNonCalleeSaveRegister(MachineRegisterInfo &MRI, 28 LivePhysRegs &LiveRegs, 29 const TargetRegisterClass &RC, 30 bool Unused = false) { 31 // Mark callee saved registers as used so we will not choose them. 32 const MCPhysReg *CSRegs = MRI.getCalleeSavedRegs(); 33 for (unsigned i = 0; CSRegs[i]; ++i) 34 LiveRegs.addReg(CSRegs[i]); 35 36 if (Unused) { 37 // We are looking for a register that can be used throughout the entire 38 // function, so any use is unacceptable. 39 for (MCRegister Reg : RC) { 40 if (!MRI.isPhysRegUsed(Reg) && LiveRegs.available(MRI, Reg)) 41 return Reg; 42 } 43 } else { 44 for (MCRegister Reg : RC) { 45 if (LiveRegs.available(MRI, Reg)) 46 return Reg; 47 } 48 } 49 50 return MCRegister(); 51 } 52 53 static void getVGPRSpillLaneOrTempRegister(MachineFunction &MF, 54 LivePhysRegs &LiveRegs, 55 Register &TempSGPR, 56 Optional<int> &FrameIndex, 57 bool IsFP) { 58 SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 59 MachineFrameInfo &FrameInfo = MF.getFrameInfo(); 60 61 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 62 const SIRegisterInfo *TRI = ST.getRegisterInfo(); 63 64 // We need to save and restore the current FP/BP. 65 66 // 1: If there is already a VGPR with free lanes, use it. We 67 // may already have to pay the penalty for spilling a CSR VGPR. 68 if (MFI->haveFreeLanesForSGPRSpill(MF, 1)) { 69 int NewFI = FrameInfo.CreateStackObject(4, Align(4), true, nullptr, 70 TargetStackID::SGPRSpill); 71 72 if (!MFI->allocateSGPRSpillToVGPR(MF, NewFI)) 73 llvm_unreachable("allocate SGPR spill should have worked"); 74 75 FrameIndex = NewFI; 76 77 LLVM_DEBUG(auto Spill = MFI->getSGPRToVGPRSpills(NewFI).front(); 78 dbgs() << "Spilling " << (IsFP ? "FP" : "BP") << " to " 79 << printReg(Spill.VGPR, TRI) << ':' << Spill.Lane 80 << '\n'); 81 return; 82 } 83 84 // 2: Next, try to save the FP/BP in an unused SGPR. 85 TempSGPR = findScratchNonCalleeSaveRegister( 86 MF.getRegInfo(), LiveRegs, AMDGPU::SReg_32_XM0_XEXECRegClass, true); 87 88 if (!TempSGPR) { 89 int NewFI = FrameInfo.CreateStackObject(4, Align(4), true, nullptr, 90 TargetStackID::SGPRSpill); 91 92 if (TRI->spillSGPRToVGPR() && MFI->allocateSGPRSpillToVGPR(MF, NewFI)) { 93 // 3: There's no free lane to spill, and no free register to save FP/BP, 94 // so we're forced to spill another VGPR to use for the spill. 95 FrameIndex = NewFI; 96 97 LLVM_DEBUG( 98 auto Spill = MFI->getSGPRToVGPRSpills(NewFI).front(); 99 dbgs() << (IsFP ? "FP" : "BP") << " requires fallback spill to " 100 << printReg(Spill.VGPR, TRI) << ':' << Spill.Lane << '\n';); 101 } else { 102 // Remove dead <NewFI> index 103 MF.getFrameInfo().RemoveStackObject(NewFI); 104 // 4: If all else fails, spill the FP/BP to memory. 105 FrameIndex = FrameInfo.CreateSpillStackObject(4, Align(4)); 106 LLVM_DEBUG(dbgs() << "Reserved FI " << FrameIndex << " for spilling " 107 << (IsFP ? "FP" : "BP") << '\n'); 108 } 109 } else { 110 LLVM_DEBUG(dbgs() << "Saving " << (IsFP ? "FP" : "BP") << " with copy to " 111 << printReg(TempSGPR, TRI) << '\n'); 112 } 113 } 114 115 // We need to specially emit stack operations here because a different frame 116 // register is used than in the rest of the function, as getFrameRegister would 117 // use. 118 static void buildPrologSpill(const GCNSubtarget &ST, LivePhysRegs &LiveRegs, 119 MachineBasicBlock &MBB, 120 MachineBasicBlock::iterator I, 121 const SIInstrInfo *TII, Register SpillReg, 122 Register ScratchRsrcReg, Register SPReg, int FI) { 123 MachineFunction *MF = MBB.getParent(); 124 MachineFrameInfo &MFI = MF->getFrameInfo(); 125 126 int64_t Offset = MFI.getObjectOffset(FI); 127 128 MachineMemOperand *MMO = MF->getMachineMemOperand( 129 MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore, 4, 130 MFI.getObjectAlign(FI)); 131 132 if (ST.enableFlatScratch()) { 133 if (TII->isLegalFLATOffset(Offset, AMDGPUAS::PRIVATE_ADDRESS, 134 SIInstrFlags::FlatScratch)) { 135 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::SCRATCH_STORE_DWORD_SADDR)) 136 .addReg(SpillReg, RegState::Kill) 137 .addReg(SPReg) 138 .addImm(Offset) 139 .addImm(0) // cpol 140 .addMemOperand(MMO); 141 return; 142 } 143 } else if (SIInstrInfo::isLegalMUBUFImmOffset(Offset)) { 144 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::BUFFER_STORE_DWORD_OFFSET)) 145 .addReg(SpillReg, RegState::Kill) 146 .addReg(ScratchRsrcReg) 147 .addReg(SPReg) 148 .addImm(Offset) 149 .addImm(0) // cpol 150 .addImm(0) // tfe 151 .addImm(0) // swz 152 .addMemOperand(MMO); 153 return; 154 } 155 156 // Don't clobber the TmpVGPR if we also need a scratch reg for the stack 157 // offset in the spill. 158 LiveRegs.addReg(SpillReg); 159 160 if (ST.enableFlatScratch()) { 161 MCPhysReg OffsetReg = findScratchNonCalleeSaveRegister( 162 MF->getRegInfo(), LiveRegs, AMDGPU::SReg_32_XM0RegClass); 163 164 bool HasOffsetReg = OffsetReg; 165 if (!HasOffsetReg) { 166 // No free register, use stack pointer and restore afterwards. 167 OffsetReg = SPReg; 168 } 169 170 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::S_ADD_U32), OffsetReg) 171 .addReg(SPReg) 172 .addImm(Offset); 173 174 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::SCRATCH_STORE_DWORD_SADDR)) 175 .addReg(SpillReg, RegState::Kill) 176 .addReg(OffsetReg, HasOffsetReg ? RegState::Kill : 0) 177 .addImm(0) // offset 178 .addImm(0) // cpol 179 .addMemOperand(MMO); 180 181 if (!HasOffsetReg) { 182 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::S_SUB_U32), OffsetReg) 183 .addReg(SPReg) 184 .addImm(Offset); 185 } 186 } else { 187 MCPhysReg OffsetReg = findScratchNonCalleeSaveRegister( 188 MF->getRegInfo(), LiveRegs, AMDGPU::VGPR_32RegClass); 189 190 if (OffsetReg) { 191 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::V_MOV_B32_e32), OffsetReg) 192 .addImm(Offset); 193 194 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::BUFFER_STORE_DWORD_OFFEN)) 195 .addReg(SpillReg, RegState::Kill) 196 .addReg(OffsetReg, RegState::Kill) 197 .addReg(ScratchRsrcReg) 198 .addReg(SPReg) 199 .addImm(0) // offset 200 .addImm(0) // cpol 201 .addImm(0) // tfe 202 .addImm(0) // swz 203 .addMemOperand(MMO); 204 } else { 205 // No free register, use stack pointer and restore afterwards. 206 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::S_ADD_U32), SPReg) 207 .addReg(SPReg) 208 .addImm(Offset); 209 210 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::BUFFER_STORE_DWORD_OFFSET)) 211 .addReg(SpillReg, RegState::Kill) 212 .addReg(ScratchRsrcReg) 213 .addReg(SPReg) 214 .addImm(0) // offset 215 .addImm(0) // cpol 216 .addImm(0) // tfe 217 .addImm(0) // swz 218 .addMemOperand(MMO); 219 220 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::S_SUB_U32), SPReg) 221 .addReg(SPReg) 222 .addImm(Offset); 223 } 224 } 225 226 LiveRegs.removeReg(SpillReg); 227 } 228 229 static void buildEpilogReload(const GCNSubtarget &ST, LivePhysRegs &LiveRegs, 230 MachineBasicBlock &MBB, 231 MachineBasicBlock::iterator I, 232 const SIInstrInfo *TII, Register SpillReg, 233 Register ScratchRsrcReg, Register SPReg, int FI) { 234 MachineFunction *MF = MBB.getParent(); 235 MachineFrameInfo &MFI = MF->getFrameInfo(); 236 int64_t Offset = MFI.getObjectOffset(FI); 237 238 MachineMemOperand *MMO = MF->getMachineMemOperand( 239 MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad, 4, 240 MFI.getObjectAlign(FI)); 241 242 if (ST.enableFlatScratch()) { 243 if (TII->isLegalFLATOffset(Offset, AMDGPUAS::PRIVATE_ADDRESS, 244 SIInstrFlags::FlatScratch)) { 245 BuildMI(MBB, I, DebugLoc(), 246 TII->get(AMDGPU::SCRATCH_LOAD_DWORD_SADDR), SpillReg) 247 .addReg(SPReg) 248 .addImm(Offset) 249 .addImm(0) // cpol 250 .addMemOperand(MMO); 251 return; 252 } 253 MCPhysReg OffsetReg = findScratchNonCalleeSaveRegister( 254 MF->getRegInfo(), LiveRegs, AMDGPU::SReg_32_XM0RegClass); 255 if (!OffsetReg) 256 report_fatal_error("failed to find free scratch register"); 257 258 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::S_ADD_U32), OffsetReg) 259 .addReg(SPReg) 260 .addImm(Offset); 261 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::SCRATCH_LOAD_DWORD_SADDR), 262 SpillReg) 263 .addReg(OffsetReg, RegState::Kill) 264 .addImm(0) 265 .addImm(0) // cpol 266 .addMemOperand(MMO); 267 return; 268 } 269 270 if (SIInstrInfo::isLegalMUBUFImmOffset(Offset)) { 271 BuildMI(MBB, I, DebugLoc(), 272 TII->get(AMDGPU::BUFFER_LOAD_DWORD_OFFSET), SpillReg) 273 .addReg(ScratchRsrcReg) 274 .addReg(SPReg) 275 .addImm(Offset) 276 .addImm(0) // cpol 277 .addImm(0) // tfe 278 .addImm(0) // swz 279 .addMemOperand(MMO); 280 return; 281 } 282 283 MCPhysReg OffsetReg = findScratchNonCalleeSaveRegister( 284 MF->getRegInfo(), LiveRegs, AMDGPU::VGPR_32RegClass); 285 if (!OffsetReg) 286 report_fatal_error("failed to find free scratch register"); 287 288 BuildMI(MBB, I, DebugLoc(), TII->get(AMDGPU::V_MOV_B32_e32), OffsetReg) 289 .addImm(Offset); 290 291 BuildMI(MBB, I, DebugLoc(), 292 TII->get(AMDGPU::BUFFER_LOAD_DWORD_OFFEN), SpillReg) 293 .addReg(OffsetReg, RegState::Kill) 294 .addReg(ScratchRsrcReg) 295 .addReg(SPReg) 296 .addImm(0) 297 .addImm(0) // cpol 298 .addImm(0) // tfe 299 .addImm(0) // swz 300 .addMemOperand(MMO); 301 } 302 303 static void buildGitPtr(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 304 const DebugLoc &DL, const SIInstrInfo *TII, 305 Register TargetReg) { 306 MachineFunction *MF = MBB.getParent(); 307 const SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 308 const SIRegisterInfo *TRI = &TII->getRegisterInfo(); 309 const MCInstrDesc &SMovB32 = TII->get(AMDGPU::S_MOV_B32); 310 Register TargetLo = TRI->getSubReg(TargetReg, AMDGPU::sub0); 311 Register TargetHi = TRI->getSubReg(TargetReg, AMDGPU::sub1); 312 313 if (MFI->getGITPtrHigh() != 0xffffffff) { 314 BuildMI(MBB, I, DL, SMovB32, TargetHi) 315 .addImm(MFI->getGITPtrHigh()) 316 .addReg(TargetReg, RegState::ImplicitDefine); 317 } else { 318 const MCInstrDesc &GetPC64 = TII->get(AMDGPU::S_GETPC_B64); 319 BuildMI(MBB, I, DL, GetPC64, TargetReg); 320 } 321 Register GitPtrLo = MFI->getGITPtrLoReg(*MF); 322 MF->getRegInfo().addLiveIn(GitPtrLo); 323 MBB.addLiveIn(GitPtrLo); 324 BuildMI(MBB, I, DL, SMovB32, TargetLo) 325 .addReg(GitPtrLo); 326 } 327 328 // Emit flat scratch setup code, assuming `MFI->hasFlatScratchInit()` 329 void SIFrameLowering::emitEntryFunctionFlatScratchInit( 330 MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 331 const DebugLoc &DL, Register ScratchWaveOffsetReg) const { 332 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 333 const SIInstrInfo *TII = ST.getInstrInfo(); 334 const SIRegisterInfo *TRI = &TII->getRegisterInfo(); 335 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 336 337 // We don't need this if we only have spills since there is no user facing 338 // scratch. 339 340 // TODO: If we know we don't have flat instructions earlier, we can omit 341 // this from the input registers. 342 // 343 // TODO: We only need to know if we access scratch space through a flat 344 // pointer. Because we only detect if flat instructions are used at all, 345 // this will be used more often than necessary on VI. 346 347 Register FlatScrInitLo; 348 Register FlatScrInitHi; 349 350 if (ST.isAmdPalOS()) { 351 // Extract the scratch offset from the descriptor in the GIT 352 LivePhysRegs LiveRegs; 353 LiveRegs.init(*TRI); 354 LiveRegs.addLiveIns(MBB); 355 356 // Find unused reg to load flat scratch init into 357 MachineRegisterInfo &MRI = MF.getRegInfo(); 358 Register FlatScrInit = AMDGPU::NoRegister; 359 ArrayRef<MCPhysReg> AllSGPR64s = TRI->getAllSGPR64(MF); 360 unsigned NumPreloaded = (MFI->getNumPreloadedSGPRs() + 1) / 2; 361 AllSGPR64s = AllSGPR64s.slice( 362 std::min(static_cast<unsigned>(AllSGPR64s.size()), NumPreloaded)); 363 Register GITPtrLoReg = MFI->getGITPtrLoReg(MF); 364 for (MCPhysReg Reg : AllSGPR64s) { 365 if (LiveRegs.available(MRI, Reg) && MRI.isAllocatable(Reg) && 366 !TRI->isSubRegisterEq(Reg, GITPtrLoReg)) { 367 FlatScrInit = Reg; 368 break; 369 } 370 } 371 assert(FlatScrInit && "Failed to find free register for scratch init"); 372 373 FlatScrInitLo = TRI->getSubReg(FlatScrInit, AMDGPU::sub0); 374 FlatScrInitHi = TRI->getSubReg(FlatScrInit, AMDGPU::sub1); 375 376 buildGitPtr(MBB, I, DL, TII, FlatScrInit); 377 378 // We now have the GIT ptr - now get the scratch descriptor from the entry 379 // at offset 0 (or offset 16 for a compute shader). 380 MachinePointerInfo PtrInfo(AMDGPUAS::CONSTANT_ADDRESS); 381 const MCInstrDesc &LoadDwordX2 = TII->get(AMDGPU::S_LOAD_DWORDX2_IMM); 382 auto *MMO = MF.getMachineMemOperand( 383 PtrInfo, 384 MachineMemOperand::MOLoad | MachineMemOperand::MOInvariant | 385 MachineMemOperand::MODereferenceable, 386 8, Align(4)); 387 unsigned Offset = 388 MF.getFunction().getCallingConv() == CallingConv::AMDGPU_CS ? 16 : 0; 389 const GCNSubtarget &Subtarget = MF.getSubtarget<GCNSubtarget>(); 390 unsigned EncodedOffset = AMDGPU::convertSMRDOffsetUnits(Subtarget, Offset); 391 BuildMI(MBB, I, DL, LoadDwordX2, FlatScrInit) 392 .addReg(FlatScrInit) 393 .addImm(EncodedOffset) // offset 394 .addImm(0) // cpol 395 .addMemOperand(MMO); 396 397 // Mask the offset in [47:0] of the descriptor 398 const MCInstrDesc &SAndB32 = TII->get(AMDGPU::S_AND_B32); 399 BuildMI(MBB, I, DL, SAndB32, FlatScrInitHi) 400 .addReg(FlatScrInitHi) 401 .addImm(0xffff); 402 } else { 403 Register FlatScratchInitReg = 404 MFI->getPreloadedReg(AMDGPUFunctionArgInfo::FLAT_SCRATCH_INIT); 405 assert(FlatScratchInitReg); 406 407 MachineRegisterInfo &MRI = MF.getRegInfo(); 408 MRI.addLiveIn(FlatScratchInitReg); 409 MBB.addLiveIn(FlatScratchInitReg); 410 411 FlatScrInitLo = TRI->getSubReg(FlatScratchInitReg, AMDGPU::sub0); 412 FlatScrInitHi = TRI->getSubReg(FlatScratchInitReg, AMDGPU::sub1); 413 } 414 415 // Do a 64-bit pointer add. 416 if (ST.flatScratchIsPointer()) { 417 if (ST.getGeneration() >= AMDGPUSubtarget::GFX10) { 418 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADD_U32), FlatScrInitLo) 419 .addReg(FlatScrInitLo) 420 .addReg(ScratchWaveOffsetReg); 421 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADDC_U32), FlatScrInitHi) 422 .addReg(FlatScrInitHi) 423 .addImm(0); 424 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_SETREG_B32)). 425 addReg(FlatScrInitLo). 426 addImm(int16_t(AMDGPU::Hwreg::ID_FLAT_SCR_LO | 427 (31 << AMDGPU::Hwreg::WIDTH_M1_SHIFT_))); 428 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_SETREG_B32)). 429 addReg(FlatScrInitHi). 430 addImm(int16_t(AMDGPU::Hwreg::ID_FLAT_SCR_HI | 431 (31 << AMDGPU::Hwreg::WIDTH_M1_SHIFT_))); 432 return; 433 } 434 435 // For GFX9. 436 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADD_U32), AMDGPU::FLAT_SCR_LO) 437 .addReg(FlatScrInitLo) 438 .addReg(ScratchWaveOffsetReg); 439 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADDC_U32), AMDGPU::FLAT_SCR_HI) 440 .addReg(FlatScrInitHi) 441 .addImm(0); 442 443 return; 444 } 445 446 assert(ST.getGeneration() < AMDGPUSubtarget::GFX9); 447 448 // Copy the size in bytes. 449 BuildMI(MBB, I, DL, TII->get(AMDGPU::COPY), AMDGPU::FLAT_SCR_LO) 450 .addReg(FlatScrInitHi, RegState::Kill); 451 452 // Add wave offset in bytes to private base offset. 453 // See comment in AMDKernelCodeT.h for enable_sgpr_flat_scratch_init. 454 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADD_U32), FlatScrInitLo) 455 .addReg(FlatScrInitLo) 456 .addReg(ScratchWaveOffsetReg); 457 458 // Convert offset to 256-byte units. 459 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_LSHR_B32), AMDGPU::FLAT_SCR_HI) 460 .addReg(FlatScrInitLo, RegState::Kill) 461 .addImm(8); 462 } 463 464 // Note SGPRSpill stack IDs should only be used for SGPR spilling to VGPRs, not 465 // memory. They should have been removed by now. 466 static bool allStackObjectsAreDead(const MachineFrameInfo &MFI) { 467 for (int I = MFI.getObjectIndexBegin(), E = MFI.getObjectIndexEnd(); 468 I != E; ++I) { 469 if (!MFI.isDeadObjectIndex(I)) 470 return false; 471 } 472 473 return true; 474 } 475 476 // Shift down registers reserved for the scratch RSRC. 477 Register SIFrameLowering::getEntryFunctionReservedScratchRsrcReg( 478 MachineFunction &MF) const { 479 480 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 481 const SIInstrInfo *TII = ST.getInstrInfo(); 482 const SIRegisterInfo *TRI = &TII->getRegisterInfo(); 483 MachineRegisterInfo &MRI = MF.getRegInfo(); 484 SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 485 486 assert(MFI->isEntryFunction()); 487 488 Register ScratchRsrcReg = MFI->getScratchRSrcReg(); 489 490 if (!ScratchRsrcReg || (!MRI.isPhysRegUsed(ScratchRsrcReg) && 491 allStackObjectsAreDead(MF.getFrameInfo()))) 492 return Register(); 493 494 if (ST.hasSGPRInitBug() || 495 ScratchRsrcReg != TRI->reservedPrivateSegmentBufferReg(MF)) 496 return ScratchRsrcReg; 497 498 // We reserved the last registers for this. Shift it down to the end of those 499 // which were actually used. 500 // 501 // FIXME: It might be safer to use a pseudoregister before replacement. 502 503 // FIXME: We should be able to eliminate unused input registers. We only 504 // cannot do this for the resources required for scratch access. For now we 505 // skip over user SGPRs and may leave unused holes. 506 507 unsigned NumPreloaded = (MFI->getNumPreloadedSGPRs() + 3) / 4; 508 ArrayRef<MCPhysReg> AllSGPR128s = TRI->getAllSGPR128(MF); 509 AllSGPR128s = AllSGPR128s.slice(std::min(static_cast<unsigned>(AllSGPR128s.size()), NumPreloaded)); 510 511 // Skip the last N reserved elements because they should have already been 512 // reserved for VCC etc. 513 Register GITPtrLoReg = MFI->getGITPtrLoReg(MF); 514 for (MCPhysReg Reg : AllSGPR128s) { 515 // Pick the first unallocated one. Make sure we don't clobber the other 516 // reserved input we needed. Also for PAL, make sure we don't clobber 517 // the GIT pointer passed in SGPR0 or SGPR8. 518 if (!MRI.isPhysRegUsed(Reg) && MRI.isAllocatable(Reg) && 519 !TRI->isSubRegisterEq(Reg, GITPtrLoReg)) { 520 MRI.replaceRegWith(ScratchRsrcReg, Reg); 521 MFI->setScratchRSrcReg(Reg); 522 return Reg; 523 } 524 } 525 526 return ScratchRsrcReg; 527 } 528 529 static unsigned getScratchScaleFactor(const GCNSubtarget &ST) { 530 return ST.enableFlatScratch() ? 1 : ST.getWavefrontSize(); 531 } 532 533 void SIFrameLowering::emitEntryFunctionPrologue(MachineFunction &MF, 534 MachineBasicBlock &MBB) const { 535 assert(&MF.front() == &MBB && "Shrink-wrapping not yet supported"); 536 537 // FIXME: If we only have SGPR spills, we won't actually be using scratch 538 // memory since these spill to VGPRs. We should be cleaning up these unused 539 // SGPR spill frame indices somewhere. 540 541 // FIXME: We still have implicit uses on SGPR spill instructions in case they 542 // need to spill to vector memory. It's likely that will not happen, but at 543 // this point it appears we need the setup. This part of the prolog should be 544 // emitted after frame indices are eliminated. 545 546 // FIXME: Remove all of the isPhysRegUsed checks 547 548 SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 549 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 550 const SIInstrInfo *TII = ST.getInstrInfo(); 551 const SIRegisterInfo *TRI = &TII->getRegisterInfo(); 552 MachineRegisterInfo &MRI = MF.getRegInfo(); 553 const Function &F = MF.getFunction(); 554 555 assert(MFI->isEntryFunction()); 556 557 Register PreloadedScratchWaveOffsetReg = MFI->getPreloadedReg( 558 AMDGPUFunctionArgInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET); 559 // FIXME: Hack to not crash in situations which emitted an error. 560 if (!PreloadedScratchWaveOffsetReg) 561 return; 562 563 // We need to do the replacement of the private segment buffer register even 564 // if there are no stack objects. There could be stores to undef or a 565 // constant without an associated object. 566 // 567 // This will return `Register()` in cases where there are no actual 568 // uses of the SRSRC. 569 Register ScratchRsrcReg; 570 if (!ST.enableFlatScratch()) 571 ScratchRsrcReg = getEntryFunctionReservedScratchRsrcReg(MF); 572 573 // Make the selected register live throughout the function. 574 if (ScratchRsrcReg) { 575 for (MachineBasicBlock &OtherBB : MF) { 576 if (&OtherBB != &MBB) { 577 OtherBB.addLiveIn(ScratchRsrcReg); 578 } 579 } 580 } 581 582 // Now that we have fixed the reserved SRSRC we need to locate the 583 // (potentially) preloaded SRSRC. 584 Register PreloadedScratchRsrcReg; 585 if (ST.isAmdHsaOrMesa(F)) { 586 PreloadedScratchRsrcReg = 587 MFI->getPreloadedReg(AMDGPUFunctionArgInfo::PRIVATE_SEGMENT_BUFFER); 588 if (ScratchRsrcReg && PreloadedScratchRsrcReg) { 589 // We added live-ins during argument lowering, but since they were not 590 // used they were deleted. We're adding the uses now, so add them back. 591 MRI.addLiveIn(PreloadedScratchRsrcReg); 592 MBB.addLiveIn(PreloadedScratchRsrcReg); 593 } 594 } 595 596 // Debug location must be unknown since the first debug location is used to 597 // determine the end of the prologue. 598 DebugLoc DL; 599 MachineBasicBlock::iterator I = MBB.begin(); 600 601 // We found the SRSRC first because it needs four registers and has an 602 // alignment requirement. If the SRSRC that we found is clobbering with 603 // the scratch wave offset, which may be in a fixed SGPR or a free SGPR 604 // chosen by SITargetLowering::allocateSystemSGPRs, COPY the scratch 605 // wave offset to a free SGPR. 606 Register ScratchWaveOffsetReg; 607 if (TRI->isSubRegisterEq(ScratchRsrcReg, PreloadedScratchWaveOffsetReg)) { 608 ArrayRef<MCPhysReg> AllSGPRs = TRI->getAllSGPR32(MF); 609 unsigned NumPreloaded = MFI->getNumPreloadedSGPRs(); 610 AllSGPRs = AllSGPRs.slice( 611 std::min(static_cast<unsigned>(AllSGPRs.size()), NumPreloaded)); 612 Register GITPtrLoReg = MFI->getGITPtrLoReg(MF); 613 for (MCPhysReg Reg : AllSGPRs) { 614 if (!MRI.isPhysRegUsed(Reg) && MRI.isAllocatable(Reg) && 615 !TRI->isSubRegisterEq(ScratchRsrcReg, Reg) && GITPtrLoReg != Reg) { 616 ScratchWaveOffsetReg = Reg; 617 BuildMI(MBB, I, DL, TII->get(AMDGPU::COPY), ScratchWaveOffsetReg) 618 .addReg(PreloadedScratchWaveOffsetReg, RegState::Kill); 619 break; 620 } 621 } 622 } else { 623 ScratchWaveOffsetReg = PreloadedScratchWaveOffsetReg; 624 } 625 assert(ScratchWaveOffsetReg); 626 627 if (requiresStackPointerReference(MF)) { 628 Register SPReg = MFI->getStackPtrOffsetReg(); 629 assert(SPReg != AMDGPU::SP_REG); 630 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_MOV_B32), SPReg) 631 .addImm(MF.getFrameInfo().getStackSize() * getScratchScaleFactor(ST)); 632 } 633 634 if (hasFP(MF)) { 635 Register FPReg = MFI->getFrameOffsetReg(); 636 assert(FPReg != AMDGPU::FP_REG); 637 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_MOV_B32), FPReg).addImm(0); 638 } 639 640 if (MFI->hasFlatScratchInit() || ScratchRsrcReg) { 641 MRI.addLiveIn(PreloadedScratchWaveOffsetReg); 642 MBB.addLiveIn(PreloadedScratchWaveOffsetReg); 643 } 644 645 if (MFI->hasFlatScratchInit()) { 646 emitEntryFunctionFlatScratchInit(MF, MBB, I, DL, ScratchWaveOffsetReg); 647 } 648 649 if (ScratchRsrcReg) { 650 emitEntryFunctionScratchRsrcRegSetup(MF, MBB, I, DL, 651 PreloadedScratchRsrcReg, 652 ScratchRsrcReg, ScratchWaveOffsetReg); 653 } 654 } 655 656 // Emit scratch RSRC setup code, assuming `ScratchRsrcReg != AMDGPU::NoReg` 657 void SIFrameLowering::emitEntryFunctionScratchRsrcRegSetup( 658 MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 659 const DebugLoc &DL, Register PreloadedScratchRsrcReg, 660 Register ScratchRsrcReg, Register ScratchWaveOffsetReg) const { 661 662 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 663 const SIInstrInfo *TII = ST.getInstrInfo(); 664 const SIRegisterInfo *TRI = &TII->getRegisterInfo(); 665 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 666 const Function &Fn = MF.getFunction(); 667 668 if (ST.isAmdPalOS()) { 669 // The pointer to the GIT is formed from the offset passed in and either 670 // the amdgpu-git-ptr-high function attribute or the top part of the PC 671 Register Rsrc01 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub0_sub1); 672 673 buildGitPtr(MBB, I, DL, TII, Rsrc01); 674 675 // We now have the GIT ptr - now get the scratch descriptor from the entry 676 // at offset 0 (or offset 16 for a compute shader). 677 MachinePointerInfo PtrInfo(AMDGPUAS::CONSTANT_ADDRESS); 678 const MCInstrDesc &LoadDwordX4 = TII->get(AMDGPU::S_LOAD_DWORDX4_IMM); 679 auto MMO = MF.getMachineMemOperand(PtrInfo, 680 MachineMemOperand::MOLoad | 681 MachineMemOperand::MOInvariant | 682 MachineMemOperand::MODereferenceable, 683 16, Align(4)); 684 unsigned Offset = Fn.getCallingConv() == CallingConv::AMDGPU_CS ? 16 : 0; 685 const GCNSubtarget &Subtarget = MF.getSubtarget<GCNSubtarget>(); 686 unsigned EncodedOffset = AMDGPU::convertSMRDOffsetUnits(Subtarget, Offset); 687 BuildMI(MBB, I, DL, LoadDwordX4, ScratchRsrcReg) 688 .addReg(Rsrc01) 689 .addImm(EncodedOffset) // offset 690 .addImm(0) // cpol 691 .addReg(ScratchRsrcReg, RegState::ImplicitDefine) 692 .addMemOperand(MMO); 693 } else if (ST.isMesaGfxShader(Fn) || !PreloadedScratchRsrcReg) { 694 assert(!ST.isAmdHsaOrMesa(Fn)); 695 const MCInstrDesc &SMovB32 = TII->get(AMDGPU::S_MOV_B32); 696 697 Register Rsrc2 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub2); 698 Register Rsrc3 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub3); 699 700 // Use relocations to get the pointer, and setup the other bits manually. 701 uint64_t Rsrc23 = TII->getScratchRsrcWords23(); 702 703 if (MFI->hasImplicitBufferPtr()) { 704 Register Rsrc01 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub0_sub1); 705 706 if (AMDGPU::isCompute(MF.getFunction().getCallingConv())) { 707 const MCInstrDesc &Mov64 = TII->get(AMDGPU::S_MOV_B64); 708 709 BuildMI(MBB, I, DL, Mov64, Rsrc01) 710 .addReg(MFI->getImplicitBufferPtrUserSGPR()) 711 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 712 } else { 713 const MCInstrDesc &LoadDwordX2 = TII->get(AMDGPU::S_LOAD_DWORDX2_IMM); 714 715 MachinePointerInfo PtrInfo(AMDGPUAS::CONSTANT_ADDRESS); 716 auto MMO = MF.getMachineMemOperand( 717 PtrInfo, 718 MachineMemOperand::MOLoad | MachineMemOperand::MOInvariant | 719 MachineMemOperand::MODereferenceable, 720 8, Align(4)); 721 BuildMI(MBB, I, DL, LoadDwordX2, Rsrc01) 722 .addReg(MFI->getImplicitBufferPtrUserSGPR()) 723 .addImm(0) // offset 724 .addImm(0) // cpol 725 .addMemOperand(MMO) 726 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 727 728 MF.getRegInfo().addLiveIn(MFI->getImplicitBufferPtrUserSGPR()); 729 MBB.addLiveIn(MFI->getImplicitBufferPtrUserSGPR()); 730 } 731 } else { 732 Register Rsrc0 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub0); 733 Register Rsrc1 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub1); 734 735 BuildMI(MBB, I, DL, SMovB32, Rsrc0) 736 .addExternalSymbol("SCRATCH_RSRC_DWORD0") 737 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 738 739 BuildMI(MBB, I, DL, SMovB32, Rsrc1) 740 .addExternalSymbol("SCRATCH_RSRC_DWORD1") 741 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 742 743 } 744 745 BuildMI(MBB, I, DL, SMovB32, Rsrc2) 746 .addImm(Rsrc23 & 0xffffffff) 747 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 748 749 BuildMI(MBB, I, DL, SMovB32, Rsrc3) 750 .addImm(Rsrc23 >> 32) 751 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 752 } else if (ST.isAmdHsaOrMesa(Fn)) { 753 assert(PreloadedScratchRsrcReg); 754 755 if (ScratchRsrcReg != PreloadedScratchRsrcReg) { 756 BuildMI(MBB, I, DL, TII->get(AMDGPU::COPY), ScratchRsrcReg) 757 .addReg(PreloadedScratchRsrcReg, RegState::Kill); 758 } 759 } 760 761 // Add the scratch wave offset into the scratch RSRC. 762 // 763 // We only want to update the first 48 bits, which is the base address 764 // pointer, without touching the adjacent 16 bits of flags. We know this add 765 // cannot carry-out from bit 47, otherwise the scratch allocation would be 766 // impossible to fit in the 48-bit global address space. 767 // 768 // TODO: Evaluate if it is better to just construct an SRD using the flat 769 // scratch init and some constants rather than update the one we are passed. 770 Register ScratchRsrcSub0 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub0); 771 Register ScratchRsrcSub1 = TRI->getSubReg(ScratchRsrcReg, AMDGPU::sub1); 772 773 // We cannot Kill ScratchWaveOffsetReg here because we allow it to be used in 774 // the kernel body via inreg arguments. 775 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADD_U32), ScratchRsrcSub0) 776 .addReg(ScratchRsrcSub0) 777 .addReg(ScratchWaveOffsetReg) 778 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 779 BuildMI(MBB, I, DL, TII->get(AMDGPU::S_ADDC_U32), ScratchRsrcSub1) 780 .addReg(ScratchRsrcSub1) 781 .addImm(0) 782 .addReg(ScratchRsrcReg, RegState::ImplicitDefine); 783 } 784 785 bool SIFrameLowering::isSupportedStackID(TargetStackID::Value ID) const { 786 switch (ID) { 787 case TargetStackID::Default: 788 case TargetStackID::NoAlloc: 789 case TargetStackID::SGPRSpill: 790 return true; 791 case TargetStackID::ScalableVector: 792 return false; 793 } 794 llvm_unreachable("Invalid TargetStackID::Value"); 795 } 796 797 // Activate all lanes, returns saved exec. 798 static Register buildScratchExecCopy(LivePhysRegs &LiveRegs, 799 MachineFunction &MF, 800 MachineBasicBlock &MBB, 801 MachineBasicBlock::iterator MBBI, 802 bool IsProlog) { 803 Register ScratchExecCopy; 804 MachineRegisterInfo &MRI = MF.getRegInfo(); 805 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 806 const SIInstrInfo *TII = ST.getInstrInfo(); 807 const SIRegisterInfo &TRI = TII->getRegisterInfo(); 808 DebugLoc DL; 809 810 if (LiveRegs.empty()) { 811 if (IsProlog) { 812 LiveRegs.init(TRI); 813 LiveRegs.addLiveIns(MBB); 814 } else { 815 // In epilog. 816 LiveRegs.init(*ST.getRegisterInfo()); 817 LiveRegs.addLiveOuts(MBB); 818 LiveRegs.stepBackward(*MBBI); 819 } 820 } 821 822 ScratchExecCopy = findScratchNonCalleeSaveRegister( 823 MRI, LiveRegs, *TRI.getWaveMaskRegClass()); 824 if (!ScratchExecCopy) 825 report_fatal_error("failed to find free scratch register"); 826 827 LiveRegs.addReg(ScratchExecCopy); 828 829 const unsigned OrSaveExec = 830 ST.isWave32() ? AMDGPU::S_OR_SAVEEXEC_B32 : AMDGPU::S_OR_SAVEEXEC_B64; 831 BuildMI(MBB, MBBI, DL, TII->get(OrSaveExec), ScratchExecCopy).addImm(-1); 832 833 return ScratchExecCopy; 834 } 835 836 // A StackID of SGPRSpill implies that this is a spill from SGPR to VGPR. 837 // Otherwise we are spilling to memory. 838 static bool spilledToMemory(const MachineFunction &MF, int SaveIndex) { 839 const MachineFrameInfo &MFI = MF.getFrameInfo(); 840 return MFI.getStackID(SaveIndex) != TargetStackID::SGPRSpill; 841 } 842 843 void SIFrameLowering::emitPrologue(MachineFunction &MF, 844 MachineBasicBlock &MBB) const { 845 SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>(); 846 if (FuncInfo->isEntryFunction()) { 847 emitEntryFunctionPrologue(MF, MBB); 848 return; 849 } 850 851 const MachineFrameInfo &MFI = MF.getFrameInfo(); 852 MachineRegisterInfo &MRI = MF.getRegInfo(); 853 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 854 const SIInstrInfo *TII = ST.getInstrInfo(); 855 const SIRegisterInfo &TRI = TII->getRegisterInfo(); 856 857 Register StackPtrReg = FuncInfo->getStackPtrOffsetReg(); 858 Register FramePtrReg = FuncInfo->getFrameOffsetReg(); 859 Register BasePtrReg = 860 TRI.hasBasePointer(MF) ? TRI.getBaseRegister() : Register(); 861 LivePhysRegs LiveRegs; 862 863 MachineBasicBlock::iterator MBBI = MBB.begin(); 864 DebugLoc DL; 865 866 bool HasFP = false; 867 bool HasBP = false; 868 uint32_t NumBytes = MFI.getStackSize(); 869 uint32_t RoundedSize = NumBytes; 870 // To avoid clobbering VGPRs in lanes that weren't active on function entry, 871 // turn on all lanes before doing the spill to memory. 872 Register ScratchExecCopy; 873 874 Optional<int> FPSaveIndex = FuncInfo->FramePointerSaveIndex; 875 Optional<int> BPSaveIndex = FuncInfo->BasePointerSaveIndex; 876 877 for (const SIMachineFunctionInfo::SGPRSpillVGPR &Reg : 878 FuncInfo->getSGPRSpillVGPRs()) { 879 if (!Reg.FI.hasValue()) 880 continue; 881 882 if (!ScratchExecCopy) 883 ScratchExecCopy = buildScratchExecCopy(LiveRegs, MF, MBB, MBBI, true); 884 885 buildPrologSpill(ST, LiveRegs, MBB, MBBI, TII, Reg.VGPR, 886 FuncInfo->getScratchRSrcReg(), 887 StackPtrReg, 888 Reg.FI.getValue()); 889 } 890 891 if (FPSaveIndex && spilledToMemory(MF, *FPSaveIndex)) { 892 const int FramePtrFI = *FPSaveIndex; 893 assert(!MFI.isDeadObjectIndex(FramePtrFI)); 894 895 if (!ScratchExecCopy) 896 ScratchExecCopy = buildScratchExecCopy(LiveRegs, MF, MBB, MBBI, true); 897 898 MCPhysReg TmpVGPR = findScratchNonCalleeSaveRegister( 899 MRI, LiveRegs, AMDGPU::VGPR_32RegClass); 900 if (!TmpVGPR) 901 report_fatal_error("failed to find free scratch register"); 902 903 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpVGPR) 904 .addReg(FramePtrReg); 905 906 buildPrologSpill(ST, LiveRegs, MBB, MBBI, TII, TmpVGPR, 907 FuncInfo->getScratchRSrcReg(), StackPtrReg, FramePtrFI); 908 } 909 910 if (BPSaveIndex && spilledToMemory(MF, *BPSaveIndex)) { 911 const int BasePtrFI = *BPSaveIndex; 912 assert(!MFI.isDeadObjectIndex(BasePtrFI)); 913 914 if (!ScratchExecCopy) 915 ScratchExecCopy = buildScratchExecCopy(LiveRegs, MF, MBB, MBBI, true); 916 917 MCPhysReg TmpVGPR = findScratchNonCalleeSaveRegister( 918 MRI, LiveRegs, AMDGPU::VGPR_32RegClass); 919 if (!TmpVGPR) 920 report_fatal_error("failed to find free scratch register"); 921 922 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpVGPR) 923 .addReg(BasePtrReg); 924 925 buildPrologSpill(ST, LiveRegs, MBB, MBBI, TII, TmpVGPR, 926 FuncInfo->getScratchRSrcReg(), StackPtrReg, BasePtrFI); 927 } 928 929 if (ScratchExecCopy) { 930 // FIXME: Split block and make terminator. 931 unsigned ExecMov = ST.isWave32() ? AMDGPU::S_MOV_B32 : AMDGPU::S_MOV_B64; 932 MCRegister Exec = ST.isWave32() ? AMDGPU::EXEC_LO : AMDGPU::EXEC; 933 BuildMI(MBB, MBBI, DL, TII->get(ExecMov), Exec) 934 .addReg(ScratchExecCopy, RegState::Kill); 935 LiveRegs.addReg(ScratchExecCopy); 936 } 937 938 // In this case, spill the FP to a reserved VGPR. 939 if (FPSaveIndex && !spilledToMemory(MF, *FPSaveIndex)) { 940 const int FramePtrFI = *FPSaveIndex; 941 assert(!MFI.isDeadObjectIndex(FramePtrFI)); 942 943 assert(MFI.getStackID(FramePtrFI) == TargetStackID::SGPRSpill); 944 ArrayRef<SIMachineFunctionInfo::SpilledReg> Spill = 945 FuncInfo->getSGPRToVGPRSpills(FramePtrFI); 946 assert(Spill.size() == 1); 947 948 // Save FP before setting it up. 949 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_WRITELANE_B32), Spill[0].VGPR) 950 .addReg(FramePtrReg) 951 .addImm(Spill[0].Lane) 952 .addReg(Spill[0].VGPR, RegState::Undef); 953 } 954 955 // In this case, spill the BP to a reserved VGPR. 956 if (BPSaveIndex && !spilledToMemory(MF, *BPSaveIndex)) { 957 const int BasePtrFI = *BPSaveIndex; 958 assert(!MFI.isDeadObjectIndex(BasePtrFI)); 959 960 assert(MFI.getStackID(BasePtrFI) == TargetStackID::SGPRSpill); 961 ArrayRef<SIMachineFunctionInfo::SpilledReg> Spill = 962 FuncInfo->getSGPRToVGPRSpills(BasePtrFI); 963 assert(Spill.size() == 1); 964 965 // Save BP before setting it up. 966 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_WRITELANE_B32), Spill[0].VGPR) 967 .addReg(BasePtrReg) 968 .addImm(Spill[0].Lane) 969 .addReg(Spill[0].VGPR, RegState::Undef); 970 } 971 972 // Emit the copy if we need an FP, and are using a free SGPR to save it. 973 if (FuncInfo->SGPRForFPSaveRestoreCopy) { 974 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::COPY), 975 FuncInfo->SGPRForFPSaveRestoreCopy) 976 .addReg(FramePtrReg) 977 .setMIFlag(MachineInstr::FrameSetup); 978 } 979 980 // Emit the copy if we need a BP, and are using a free SGPR to save it. 981 if (FuncInfo->SGPRForBPSaveRestoreCopy) { 982 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::COPY), 983 FuncInfo->SGPRForBPSaveRestoreCopy) 984 .addReg(BasePtrReg) 985 .setMIFlag(MachineInstr::FrameSetup); 986 } 987 988 // If a copy has been emitted for FP and/or BP, Make the SGPRs 989 // used in the copy instructions live throughout the function. 990 SmallVector<MCPhysReg, 2> TempSGPRs; 991 if (FuncInfo->SGPRForFPSaveRestoreCopy) 992 TempSGPRs.push_back(FuncInfo->SGPRForFPSaveRestoreCopy); 993 994 if (FuncInfo->SGPRForBPSaveRestoreCopy) 995 TempSGPRs.push_back(FuncInfo->SGPRForBPSaveRestoreCopy); 996 997 if (!TempSGPRs.empty()) { 998 for (MachineBasicBlock &MBB : MF) { 999 for (MCPhysReg Reg : TempSGPRs) 1000 MBB.addLiveIn(Reg); 1001 1002 MBB.sortUniqueLiveIns(); 1003 } 1004 if (!LiveRegs.empty()) { 1005 LiveRegs.addReg(FuncInfo->SGPRForFPSaveRestoreCopy); 1006 LiveRegs.addReg(FuncInfo->SGPRForBPSaveRestoreCopy); 1007 } 1008 } 1009 1010 if (TRI.hasStackRealignment(MF)) { 1011 HasFP = true; 1012 const unsigned Alignment = MFI.getMaxAlign().value(); 1013 1014 RoundedSize += Alignment; 1015 if (LiveRegs.empty()) { 1016 LiveRegs.init(TRI); 1017 LiveRegs.addLiveIns(MBB); 1018 } 1019 1020 // s_add_u32 s33, s32, NumBytes 1021 // s_and_b32 s33, s33, 0b111...0000 1022 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::S_ADD_U32), FramePtrReg) 1023 .addReg(StackPtrReg) 1024 .addImm((Alignment - 1) * getScratchScaleFactor(ST)) 1025 .setMIFlag(MachineInstr::FrameSetup); 1026 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::S_AND_B32), FramePtrReg) 1027 .addReg(FramePtrReg, RegState::Kill) 1028 .addImm(-Alignment * getScratchScaleFactor(ST)) 1029 .setMIFlag(MachineInstr::FrameSetup); 1030 FuncInfo->setIsStackRealigned(true); 1031 } else if ((HasFP = hasFP(MF))) { 1032 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::COPY), FramePtrReg) 1033 .addReg(StackPtrReg) 1034 .setMIFlag(MachineInstr::FrameSetup); 1035 } 1036 1037 // If we need a base pointer, set it up here. It's whatever the value of 1038 // the stack pointer is at this point. Any variable size objects will be 1039 // allocated after this, so we can still use the base pointer to reference 1040 // the incoming arguments. 1041 if ((HasBP = TRI.hasBasePointer(MF))) { 1042 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::COPY), BasePtrReg) 1043 .addReg(StackPtrReg) 1044 .setMIFlag(MachineInstr::FrameSetup); 1045 } 1046 1047 if (HasFP && RoundedSize != 0) { 1048 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::S_ADD_U32), StackPtrReg) 1049 .addReg(StackPtrReg) 1050 .addImm(RoundedSize * getScratchScaleFactor(ST)) 1051 .setMIFlag(MachineInstr::FrameSetup); 1052 } 1053 1054 assert((!HasFP || (FuncInfo->SGPRForFPSaveRestoreCopy || 1055 FuncInfo->FramePointerSaveIndex)) && 1056 "Needed to save FP but didn't save it anywhere"); 1057 1058 assert((HasFP || (!FuncInfo->SGPRForFPSaveRestoreCopy && 1059 !FuncInfo->FramePointerSaveIndex)) && 1060 "Saved FP but didn't need it"); 1061 1062 assert((!HasBP || (FuncInfo->SGPRForBPSaveRestoreCopy || 1063 FuncInfo->BasePointerSaveIndex)) && 1064 "Needed to save BP but didn't save it anywhere"); 1065 1066 assert((HasBP || (!FuncInfo->SGPRForBPSaveRestoreCopy && 1067 !FuncInfo->BasePointerSaveIndex)) && 1068 "Saved BP but didn't need it"); 1069 } 1070 1071 void SIFrameLowering::emitEpilogue(MachineFunction &MF, 1072 MachineBasicBlock &MBB) const { 1073 const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>(); 1074 if (FuncInfo->isEntryFunction()) 1075 return; 1076 1077 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1078 const SIInstrInfo *TII = ST.getInstrInfo(); 1079 MachineRegisterInfo &MRI = MF.getRegInfo(); 1080 const SIRegisterInfo &TRI = TII->getRegisterInfo(); 1081 MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator(); 1082 LivePhysRegs LiveRegs; 1083 DebugLoc DL; 1084 1085 const MachineFrameInfo &MFI = MF.getFrameInfo(); 1086 uint32_t NumBytes = MFI.getStackSize(); 1087 uint32_t RoundedSize = FuncInfo->isStackRealigned() 1088 ? NumBytes + MFI.getMaxAlign().value() 1089 : NumBytes; 1090 const Register StackPtrReg = FuncInfo->getStackPtrOffsetReg(); 1091 const Register FramePtrReg = FuncInfo->getFrameOffsetReg(); 1092 const Register BasePtrReg = 1093 TRI.hasBasePointer(MF) ? TRI.getBaseRegister() : Register(); 1094 1095 Optional<int> FPSaveIndex = FuncInfo->FramePointerSaveIndex; 1096 Optional<int> BPSaveIndex = FuncInfo->BasePointerSaveIndex; 1097 1098 if (RoundedSize != 0 && hasFP(MF)) { 1099 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::S_SUB_U32), StackPtrReg) 1100 .addReg(StackPtrReg) 1101 .addImm(RoundedSize * getScratchScaleFactor(ST)) 1102 .setMIFlag(MachineInstr::FrameDestroy); 1103 } 1104 1105 if (FuncInfo->SGPRForFPSaveRestoreCopy) { 1106 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::COPY), FramePtrReg) 1107 .addReg(FuncInfo->SGPRForFPSaveRestoreCopy) 1108 .setMIFlag(MachineInstr::FrameDestroy); 1109 } 1110 1111 if (FuncInfo->SGPRForBPSaveRestoreCopy) { 1112 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::COPY), BasePtrReg) 1113 .addReg(FuncInfo->SGPRForBPSaveRestoreCopy) 1114 .setMIFlag(MachineInstr::FrameDestroy); 1115 } 1116 1117 Register ScratchExecCopy; 1118 if (FPSaveIndex) { 1119 const int FramePtrFI = *FPSaveIndex; 1120 assert(!MFI.isDeadObjectIndex(FramePtrFI)); 1121 if (spilledToMemory(MF, FramePtrFI)) { 1122 if (!ScratchExecCopy) 1123 ScratchExecCopy = buildScratchExecCopy(LiveRegs, MF, MBB, MBBI, false); 1124 1125 MCPhysReg TempVGPR = findScratchNonCalleeSaveRegister( 1126 MRI, LiveRegs, AMDGPU::VGPR_32RegClass); 1127 if (!TempVGPR) 1128 report_fatal_error("failed to find free scratch register"); 1129 buildEpilogReload(ST, LiveRegs, MBB, MBBI, TII, TempVGPR, 1130 FuncInfo->getScratchRSrcReg(), StackPtrReg, FramePtrFI); 1131 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), FramePtrReg) 1132 .addReg(TempVGPR, RegState::Kill); 1133 } else { 1134 // Reload from VGPR spill. 1135 assert(MFI.getStackID(FramePtrFI) == TargetStackID::SGPRSpill); 1136 ArrayRef<SIMachineFunctionInfo::SpilledReg> Spill = 1137 FuncInfo->getSGPRToVGPRSpills(FramePtrFI); 1138 assert(Spill.size() == 1); 1139 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_READLANE_B32), FramePtrReg) 1140 .addReg(Spill[0].VGPR) 1141 .addImm(Spill[0].Lane); 1142 } 1143 } 1144 1145 if (BPSaveIndex) { 1146 const int BasePtrFI = *BPSaveIndex; 1147 assert(!MFI.isDeadObjectIndex(BasePtrFI)); 1148 if (spilledToMemory(MF, BasePtrFI)) { 1149 if (!ScratchExecCopy) 1150 ScratchExecCopy = buildScratchExecCopy(LiveRegs, MF, MBB, MBBI, false); 1151 1152 MCPhysReg TempVGPR = findScratchNonCalleeSaveRegister( 1153 MRI, LiveRegs, AMDGPU::VGPR_32RegClass); 1154 if (!TempVGPR) 1155 report_fatal_error("failed to find free scratch register"); 1156 buildEpilogReload(ST, LiveRegs, MBB, MBBI, TII, TempVGPR, 1157 FuncInfo->getScratchRSrcReg(), StackPtrReg, BasePtrFI); 1158 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), BasePtrReg) 1159 .addReg(TempVGPR, RegState::Kill); 1160 } else { 1161 // Reload from VGPR spill. 1162 assert(MFI.getStackID(BasePtrFI) == TargetStackID::SGPRSpill); 1163 ArrayRef<SIMachineFunctionInfo::SpilledReg> Spill = 1164 FuncInfo->getSGPRToVGPRSpills(BasePtrFI); 1165 assert(Spill.size() == 1); 1166 BuildMI(MBB, MBBI, DL, TII->get(AMDGPU::V_READLANE_B32), BasePtrReg) 1167 .addReg(Spill[0].VGPR) 1168 .addImm(Spill[0].Lane); 1169 } 1170 } 1171 1172 for (const SIMachineFunctionInfo::SGPRSpillVGPR &Reg : 1173 FuncInfo->getSGPRSpillVGPRs()) { 1174 if (!Reg.FI.hasValue()) 1175 continue; 1176 1177 if (!ScratchExecCopy) 1178 ScratchExecCopy = buildScratchExecCopy(LiveRegs, MF, MBB, MBBI, false); 1179 1180 buildEpilogReload(ST, LiveRegs, MBB, MBBI, TII, Reg.VGPR, 1181 FuncInfo->getScratchRSrcReg(), StackPtrReg, 1182 Reg.FI.getValue()); 1183 } 1184 1185 if (ScratchExecCopy) { 1186 // FIXME: Split block and make terminator. 1187 unsigned ExecMov = ST.isWave32() ? AMDGPU::S_MOV_B32 : AMDGPU::S_MOV_B64; 1188 MCRegister Exec = ST.isWave32() ? AMDGPU::EXEC_LO : AMDGPU::EXEC; 1189 BuildMI(MBB, MBBI, DL, TII->get(ExecMov), Exec) 1190 .addReg(ScratchExecCopy, RegState::Kill); 1191 } 1192 } 1193 1194 #ifndef NDEBUG 1195 static bool allSGPRSpillsAreDead(const MachineFunction &MF) { 1196 const MachineFrameInfo &MFI = MF.getFrameInfo(); 1197 const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>(); 1198 for (int I = MFI.getObjectIndexBegin(), E = MFI.getObjectIndexEnd(); 1199 I != E; ++I) { 1200 if (!MFI.isDeadObjectIndex(I) && 1201 MFI.getStackID(I) == TargetStackID::SGPRSpill && 1202 (I != FuncInfo->FramePointerSaveIndex && 1203 I != FuncInfo->BasePointerSaveIndex)) { 1204 return false; 1205 } 1206 } 1207 1208 return true; 1209 } 1210 #endif 1211 1212 StackOffset SIFrameLowering::getFrameIndexReference(const MachineFunction &MF, 1213 int FI, 1214 Register &FrameReg) const { 1215 const SIRegisterInfo *RI = MF.getSubtarget<GCNSubtarget>().getRegisterInfo(); 1216 1217 FrameReg = RI->getFrameRegister(MF); 1218 return StackOffset::getFixed(MF.getFrameInfo().getObjectOffset(FI)); 1219 } 1220 1221 void SIFrameLowering::processFunctionBeforeFrameFinalized( 1222 MachineFunction &MF, 1223 RegScavenger *RS) const { 1224 MachineFrameInfo &MFI = MF.getFrameInfo(); 1225 1226 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1227 const SIRegisterInfo *TRI = ST.getRegisterInfo(); 1228 SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>(); 1229 1230 FuncInfo->removeDeadFrameIndices(MFI); 1231 assert(allSGPRSpillsAreDead(MF) && 1232 "SGPR spill should have been removed in SILowerSGPRSpills"); 1233 1234 // FIXME: The other checks should be redundant with allStackObjectsAreDead, 1235 // but currently hasNonSpillStackObjects is set only from source 1236 // allocas. Stack temps produced from legalization are not counted currently. 1237 if (!allStackObjectsAreDead(MFI)) { 1238 assert(RS && "RegScavenger required if spilling"); 1239 1240 if (FuncInfo->isEntryFunction()) { 1241 int ScavengeFI = MFI.CreateFixedObject( 1242 TRI->getSpillSize(AMDGPU::SGPR_32RegClass), 0, false); 1243 RS->addScavengingFrameIndex(ScavengeFI); 1244 } else { 1245 int ScavengeFI = MFI.CreateStackObject( 1246 TRI->getSpillSize(AMDGPU::SGPR_32RegClass), 1247 TRI->getSpillAlign(AMDGPU::SGPR_32RegClass), false); 1248 RS->addScavengingFrameIndex(ScavengeFI); 1249 } 1250 } 1251 } 1252 1253 // Only report VGPRs to generic code. 1254 void SIFrameLowering::determineCalleeSaves(MachineFunction &MF, 1255 BitVector &SavedVGPRs, 1256 RegScavenger *RS) const { 1257 TargetFrameLowering::determineCalleeSaves(MF, SavedVGPRs, RS); 1258 SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 1259 if (MFI->isEntryFunction()) 1260 return; 1261 1262 MachineFrameInfo &FrameInfo = MF.getFrameInfo(); 1263 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1264 const SIRegisterInfo *TRI = ST.getRegisterInfo(); 1265 1266 // Ignore the SGPRs the default implementation found. 1267 SavedVGPRs.clearBitsNotInMask(TRI->getAllVectorRegMask()); 1268 1269 // Do not save AGPRs prior to GFX90A because there was no easy way to do so. 1270 // In gfx908 there was do AGPR loads and stores and thus spilling also 1271 // require a temporary VGPR. 1272 if (!ST.hasGFX90AInsts()) 1273 SavedVGPRs.clearBitsInMask(TRI->getAllAGPRRegMask()); 1274 1275 // hasFP only knows about stack objects that already exist. We're now 1276 // determining the stack slots that will be created, so we have to predict 1277 // them. Stack objects force FP usage with calls. 1278 // 1279 // Note a new VGPR CSR may be introduced if one is used for the spill, but we 1280 // don't want to report it here. 1281 // 1282 // FIXME: Is this really hasReservedCallFrame? 1283 const bool WillHaveFP = 1284 FrameInfo.hasCalls() && 1285 (SavedVGPRs.any() || !allStackObjectsAreDead(FrameInfo)); 1286 1287 // VGPRs used for SGPR spilling need to be specially inserted in the prolog, 1288 // so don't allow the default insertion to handle them. 1289 for (auto SSpill : MFI->getSGPRSpillVGPRs()) 1290 SavedVGPRs.reset(SSpill.VGPR); 1291 1292 LivePhysRegs LiveRegs; 1293 LiveRegs.init(*TRI); 1294 1295 if (WillHaveFP || hasFP(MF)) { 1296 assert(!MFI->SGPRForFPSaveRestoreCopy && !MFI->FramePointerSaveIndex && 1297 "Re-reserving spill slot for FP"); 1298 getVGPRSpillLaneOrTempRegister(MF, LiveRegs, MFI->SGPRForFPSaveRestoreCopy, 1299 MFI->FramePointerSaveIndex, true); 1300 } 1301 1302 if (TRI->hasBasePointer(MF)) { 1303 if (MFI->SGPRForFPSaveRestoreCopy) 1304 LiveRegs.addReg(MFI->SGPRForFPSaveRestoreCopy); 1305 1306 assert(!MFI->SGPRForBPSaveRestoreCopy && 1307 !MFI->BasePointerSaveIndex && "Re-reserving spill slot for BP"); 1308 getVGPRSpillLaneOrTempRegister(MF, LiveRegs, MFI->SGPRForBPSaveRestoreCopy, 1309 MFI->BasePointerSaveIndex, false); 1310 } 1311 } 1312 1313 void SIFrameLowering::determineCalleeSavesSGPR(MachineFunction &MF, 1314 BitVector &SavedRegs, 1315 RegScavenger *RS) const { 1316 TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS); 1317 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 1318 if (MFI->isEntryFunction()) 1319 return; 1320 1321 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1322 const SIRegisterInfo *TRI = ST.getRegisterInfo(); 1323 1324 // The SP is specifically managed and we don't want extra spills of it. 1325 SavedRegs.reset(MFI->getStackPtrOffsetReg()); 1326 1327 const BitVector AllSavedRegs = SavedRegs; 1328 SavedRegs.clearBitsInMask(TRI->getAllVectorRegMask()); 1329 1330 // If clearing VGPRs changed the mask, we will have some CSR VGPR spills. 1331 const bool HaveAnyCSRVGPR = SavedRegs != AllSavedRegs; 1332 1333 // We have to anticipate introducing CSR VGPR spills if we don't have any 1334 // stack objects already, since we require an FP if there is a call and stack. 1335 MachineFrameInfo &FrameInfo = MF.getFrameInfo(); 1336 const bool WillHaveFP = FrameInfo.hasCalls() && HaveAnyCSRVGPR; 1337 1338 // FP will be specially managed like SP. 1339 if (WillHaveFP || hasFP(MF)) 1340 SavedRegs.reset(MFI->getFrameOffsetReg()); 1341 } 1342 1343 bool SIFrameLowering::assignCalleeSavedSpillSlots( 1344 MachineFunction &MF, const TargetRegisterInfo *TRI, 1345 std::vector<CalleeSavedInfo> &CSI) const { 1346 if (CSI.empty()) 1347 return true; // Early exit if no callee saved registers are modified! 1348 1349 const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>(); 1350 if (!FuncInfo->SGPRForFPSaveRestoreCopy && 1351 !FuncInfo->SGPRForBPSaveRestoreCopy) 1352 return false; 1353 1354 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1355 const SIRegisterInfo *RI = ST.getRegisterInfo(); 1356 Register FramePtrReg = FuncInfo->getFrameOffsetReg(); 1357 Register BasePtrReg = RI->getBaseRegister(); 1358 unsigned NumModifiedRegs = 0; 1359 1360 if (FuncInfo->SGPRForFPSaveRestoreCopy) 1361 NumModifiedRegs++; 1362 if (FuncInfo->SGPRForBPSaveRestoreCopy) 1363 NumModifiedRegs++; 1364 1365 for (auto &CS : CSI) { 1366 if (CS.getReg() == FramePtrReg && FuncInfo->SGPRForFPSaveRestoreCopy) { 1367 CS.setDstReg(FuncInfo->SGPRForFPSaveRestoreCopy); 1368 if (--NumModifiedRegs) 1369 break; 1370 } else if (CS.getReg() == BasePtrReg && 1371 FuncInfo->SGPRForBPSaveRestoreCopy) { 1372 CS.setDstReg(FuncInfo->SGPRForBPSaveRestoreCopy); 1373 if (--NumModifiedRegs) 1374 break; 1375 } 1376 } 1377 1378 return false; 1379 } 1380 1381 MachineBasicBlock::iterator SIFrameLowering::eliminateCallFramePseudoInstr( 1382 MachineFunction &MF, 1383 MachineBasicBlock &MBB, 1384 MachineBasicBlock::iterator I) const { 1385 int64_t Amount = I->getOperand(0).getImm(); 1386 if (Amount == 0) 1387 return MBB.erase(I); 1388 1389 const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 1390 const SIInstrInfo *TII = ST.getInstrInfo(); 1391 const DebugLoc &DL = I->getDebugLoc(); 1392 unsigned Opc = I->getOpcode(); 1393 bool IsDestroy = Opc == TII->getCallFrameDestroyOpcode(); 1394 uint64_t CalleePopAmount = IsDestroy ? I->getOperand(1).getImm() : 0; 1395 1396 if (!hasReservedCallFrame(MF)) { 1397 Amount = alignTo(Amount, getStackAlign()); 1398 assert(isUInt<32>(Amount) && "exceeded stack address space size"); 1399 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 1400 Register SPReg = MFI->getStackPtrOffsetReg(); 1401 1402 unsigned Op = IsDestroy ? AMDGPU::S_SUB_U32 : AMDGPU::S_ADD_U32; 1403 BuildMI(MBB, I, DL, TII->get(Op), SPReg) 1404 .addReg(SPReg) 1405 .addImm(Amount * getScratchScaleFactor(ST)); 1406 } else if (CalleePopAmount != 0) { 1407 llvm_unreachable("is this used?"); 1408 } 1409 1410 return MBB.erase(I); 1411 } 1412 1413 /// Returns true if the frame will require a reference to the stack pointer. 1414 /// 1415 /// This is the set of conditions common to setting up the stack pointer in a 1416 /// kernel, and for using a frame pointer in a callable function. 1417 /// 1418 /// FIXME: Should also check hasOpaqueSPAdjustment and if any inline asm 1419 /// references SP. 1420 static bool frameTriviallyRequiresSP(const MachineFrameInfo &MFI) { 1421 return MFI.hasVarSizedObjects() || MFI.hasStackMap() || MFI.hasPatchPoint(); 1422 } 1423 1424 // The FP for kernels is always known 0, so we never really need to setup an 1425 // explicit register for it. However, DisableFramePointerElim will force us to 1426 // use a register for it. 1427 bool SIFrameLowering::hasFP(const MachineFunction &MF) const { 1428 const MachineFrameInfo &MFI = MF.getFrameInfo(); 1429 1430 // For entry functions we can use an immediate offset in most cases, so the 1431 // presence of calls doesn't imply we need a distinct frame pointer. 1432 if (MFI.hasCalls() && 1433 !MF.getInfo<SIMachineFunctionInfo>()->isEntryFunction()) { 1434 // All offsets are unsigned, so need to be addressed in the same direction 1435 // as stack growth. 1436 1437 // FIXME: This function is pretty broken, since it can be called before the 1438 // frame layout is determined or CSR spills are inserted. 1439 return MFI.getStackSize() != 0; 1440 } 1441 1442 return frameTriviallyRequiresSP(MFI) || MFI.isFrameAddressTaken() || 1443 MF.getSubtarget<GCNSubtarget>().getRegisterInfo()->hasStackRealignment( 1444 MF) || 1445 MF.getTarget().Options.DisableFramePointerElim(MF); 1446 } 1447 1448 // This is essentially a reduced version of hasFP for entry functions. Since the 1449 // stack pointer is known 0 on entry to kernels, we never really need an FP 1450 // register. We may need to initialize the stack pointer depending on the frame 1451 // properties, which logically overlaps many of the cases where an ordinary 1452 // function would require an FP. 1453 bool SIFrameLowering::requiresStackPointerReference( 1454 const MachineFunction &MF) const { 1455 // Callable functions always require a stack pointer reference. 1456 assert(MF.getInfo<SIMachineFunctionInfo>()->isEntryFunction() && 1457 "only expected to call this for entry points"); 1458 1459 const MachineFrameInfo &MFI = MF.getFrameInfo(); 1460 1461 // Entry points ordinarily don't need to initialize SP. We have to set it up 1462 // for callees if there are any. Also note tail calls are impossible/don't 1463 // make any sense for kernels. 1464 if (MFI.hasCalls()) 1465 return true; 1466 1467 // We still need to initialize the SP if we're doing anything weird that 1468 // references the SP, like variable sized stack objects. 1469 return frameTriviallyRequiresSP(MFI); 1470 } 1471