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