1 //===- AArch64FrameLowering.cpp - AArch64 Frame Lowering -------*- C++ -*-====//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the AArch64 implementation of TargetFrameLowering class.
11 //
12 // On AArch64, stack frames are structured as follows:
13 //
14 // The stack grows downward.
15 //
16 // All of the individual frame areas on the frame below are optional, i.e. it's
17 // possible to create a function so that the particular area isn't present
18 // in the frame.
19 //
20 // At function entry, the "frame" looks as follows:
21 //
22 // |                                   | Higher address
23 // |-----------------------------------|
24 // |                                   |
25 // | arguments passed on the stack     |
26 // |                                   |
27 // |-----------------------------------| <- sp
28 // |                                   | Lower address
29 //
30 //
31 // After the prologue has run, the frame has the following general structure.
32 // Note that this doesn't depict the case where a red-zone is used. Also,
33 // technically the last frame area (VLAs) doesn't get created until in the
34 // main function body, after the prologue is run. However, it's depicted here
35 // for completeness.
36 //
37 // |                                   | Higher address
38 // |-----------------------------------|
39 // |                                   |
40 // | arguments passed on the stack     |
41 // |                                   |
42 // |-----------------------------------|
43 // |                                   |
44 // | (Win64 only) varargs from reg     |
45 // |                                   |
46 // |-----------------------------------|
47 // |                                   |
48 // | prev_fp, prev_lr                  |
49 // | (a.k.a. "frame record")           |
50 // |-----------------------------------| <- fp(=x29)
51 // |                                   |
52 // | other callee-saved registers      |
53 // |                                   |
54 // |-----------------------------------|
55 // |.empty.space.to.make.part.below....|
56 // |.aligned.in.case.it.needs.more.than| (size of this area is unknown at
57 // |.the.standard.16-byte.alignment....|  compile time; if present)
58 // |-----------------------------------|
59 // |                                   |
60 // | local variables of fixed size     |
61 // | including spill slots             |
62 // |-----------------------------------| <- bp(not defined by ABI,
63 // |.variable-sized.local.variables....|       LLVM chooses X19)
64 // |.(VLAs)............................| (size of this area is unknown at
65 // |...................................|  compile time)
66 // |-----------------------------------| <- sp
67 // |                                   | Lower address
68 //
69 //
70 // To access the data in a frame, at-compile time, a constant offset must be
71 // computable from one of the pointers (fp, bp, sp) to access it. The size
72 // of the areas with a dotted background cannot be computed at compile-time
73 // if they are present, making it required to have all three of fp, bp and
74 // sp to be set up to be able to access all contents in the frame areas,
75 // assuming all of the frame areas are non-empty.
76 //
77 // For most functions, some of the frame areas are empty. For those functions,
78 // it may not be necessary to set up fp or bp:
79 // * A base pointer is definitely needed when there are both VLAs and local
80 //   variables with more-than-default alignment requirements.
81 // * A frame pointer is definitely needed when there are local variables with
82 //   more-than-default alignment requirements.
83 //
84 // In some cases when a base pointer is not strictly needed, it is generated
85 // anyway when offsets from the frame pointer to access local variables become
86 // so large that the offset can't be encoded in the immediate fields of loads
87 // or stores.
88 //
89 // FIXME: also explain the redzone concept.
90 // FIXME: also explain the concept of reserved call frames.
91 //
92 //===----------------------------------------------------------------------===//
93 
94 #include "AArch64FrameLowering.h"
95 #include "AArch64InstrInfo.h"
96 #include "AArch64MachineFunctionInfo.h"
97 #include "AArch64RegisterInfo.h"
98 #include "AArch64Subtarget.h"
99 #include "AArch64TargetMachine.h"
100 #include "MCTargetDesc/AArch64AddressingModes.h"
101 #include "llvm/ADT/SmallVector.h"
102 #include "llvm/ADT/Statistic.h"
103 #include "llvm/CodeGen/LivePhysRegs.h"
104 #include "llvm/CodeGen/MachineBasicBlock.h"
105 #include "llvm/CodeGen/MachineFrameInfo.h"
106 #include "llvm/CodeGen/MachineFunction.h"
107 #include "llvm/CodeGen/MachineInstr.h"
108 #include "llvm/CodeGen/MachineInstrBuilder.h"
109 #include "llvm/CodeGen/MachineMemOperand.h"
110 #include "llvm/CodeGen/MachineModuleInfo.h"
111 #include "llvm/CodeGen/MachineOperand.h"
112 #include "llvm/CodeGen/MachineRegisterInfo.h"
113 #include "llvm/CodeGen/RegisterScavenging.h"
114 #include "llvm/CodeGen/TargetInstrInfo.h"
115 #include "llvm/CodeGen/TargetRegisterInfo.h"
116 #include "llvm/CodeGen/TargetSubtargetInfo.h"
117 #include "llvm/IR/Attributes.h"
118 #include "llvm/IR/CallingConv.h"
119 #include "llvm/IR/DataLayout.h"
120 #include "llvm/IR/DebugLoc.h"
121 #include "llvm/IR/Function.h"
122 #include "llvm/MC/MCDwarf.h"
123 #include "llvm/Support/CommandLine.h"
124 #include "llvm/Support/Debug.h"
125 #include "llvm/Support/ErrorHandling.h"
126 #include "llvm/Support/MathExtras.h"
127 #include "llvm/Support/raw_ostream.h"
128 #include "llvm/Target/TargetMachine.h"
129 #include "llvm/Target/TargetOptions.h"
130 #include <cassert>
131 #include <cstdint>
132 #include <iterator>
133 #include <vector>
134 
135 using namespace llvm;
136 
137 #define DEBUG_TYPE "frame-info"
138 
139 static cl::opt<bool> EnableRedZone("aarch64-redzone",
140                                    cl::desc("enable use of redzone on AArch64"),
141                                    cl::init(false), cl::Hidden);
142 
143 static cl::opt<bool>
144     ReverseCSRRestoreSeq("reverse-csr-restore-seq",
145                          cl::desc("reverse the CSR restore sequence"),
146                          cl::init(false), cl::Hidden);
147 
148 STATISTIC(NumRedZoneFunctions, "Number of functions using red zone");
149 
150 /// This is the biggest offset to the stack pointer we can encode in aarch64
151 /// instructions (without using a separate calculation and a temp register).
152 /// Note that the exception here are vector stores/loads which cannot encode any
153 /// displacements (see estimateRSStackSizeLimit(), isAArch64FrameOffsetLegal()).
154 static const unsigned DefaultSafeSPDisplacement = 255;
155 
156 /// Look at each instruction that references stack frames and return the stack
157 /// size limit beyond which some of these instructions will require a scratch
158 /// register during their expansion later.
159 static unsigned estimateRSStackSizeLimit(MachineFunction &MF) {
160   // FIXME: For now, just conservatively guestimate based on unscaled indexing
161   // range. We'll end up allocating an unnecessary spill slot a lot, but
162   // realistically that's not a big deal at this stage of the game.
163   for (MachineBasicBlock &MBB : MF) {
164     for (MachineInstr &MI : MBB) {
165       if (MI.isDebugValue() || MI.isPseudo() ||
166           MI.getOpcode() == AArch64::ADDXri ||
167           MI.getOpcode() == AArch64::ADDSXri)
168         continue;
169 
170       for (const MachineOperand &MO : MI.operands()) {
171         if (!MO.isFI())
172           continue;
173 
174         int Offset = 0;
175         if (isAArch64FrameOffsetLegal(MI, Offset, nullptr, nullptr, nullptr) ==
176             AArch64FrameOffsetCannotUpdate)
177           return 0;
178       }
179     }
180   }
181   return DefaultSafeSPDisplacement;
182 }
183 
184 bool AArch64FrameLowering::canUseRedZone(const MachineFunction &MF) const {
185   if (!EnableRedZone)
186     return false;
187   // Don't use the red zone if the function explicitly asks us not to.
188   // This is typically used for kernel code.
189   if (MF.getFunction().hasFnAttribute(Attribute::NoRedZone))
190     return false;
191 
192   const MachineFrameInfo &MFI = MF.getFrameInfo();
193   const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
194   unsigned NumBytes = AFI->getLocalStackSize();
195 
196   return !(MFI.hasCalls() || hasFP(MF) || NumBytes > 128);
197 }
198 
199 /// hasFP - Return true if the specified function should have a dedicated frame
200 /// pointer register.
201 bool AArch64FrameLowering::hasFP(const MachineFunction &MF) const {
202   const MachineFrameInfo &MFI = MF.getFrameInfo();
203   const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo();
204   // Retain behavior of always omitting the FP for leaf functions when possible.
205   if (MFI.hasCalls() && MF.getTarget().Options.DisableFramePointerElim(MF))
206     return true;
207   if (MFI.hasVarSizedObjects() || MFI.isFrameAddressTaken() ||
208       MFI.hasStackMap() || MFI.hasPatchPoint() ||
209       RegInfo->needsStackRealignment(MF))
210     return true;
211   // With large callframes around we may need to use FP to access the scavenging
212   // emergency spillslot.
213   //
214   // Unfortunately some calls to hasFP() like machine verifier ->
215   // getReservedReg() -> hasFP in the middle of global isel are too early
216   // to know the max call frame size. Hopefully conservatively returning "true"
217   // in those cases is fine.
218   // DefaultSafeSPDisplacement is fine as we only emergency spill GP regs.
219   if (!MFI.isMaxCallFrameSizeComputed() ||
220       MFI.getMaxCallFrameSize() > DefaultSafeSPDisplacement)
221     return true;
222 
223   return false;
224 }
225 
226 /// hasReservedCallFrame - Under normal circumstances, when a frame pointer is
227 /// not required, we reserve argument space for call sites in the function
228 /// immediately on entry to the current function.  This eliminates the need for
229 /// add/sub sp brackets around call sites.  Returns true if the call frame is
230 /// included as part of the stack frame.
231 bool
232 AArch64FrameLowering::hasReservedCallFrame(const MachineFunction &MF) const {
233   return !MF.getFrameInfo().hasVarSizedObjects();
234 }
235 
236 MachineBasicBlock::iterator AArch64FrameLowering::eliminateCallFramePseudoInstr(
237     MachineFunction &MF, MachineBasicBlock &MBB,
238     MachineBasicBlock::iterator I) const {
239   const AArch64InstrInfo *TII =
240       static_cast<const AArch64InstrInfo *>(MF.getSubtarget().getInstrInfo());
241   DebugLoc DL = I->getDebugLoc();
242   unsigned Opc = I->getOpcode();
243   bool IsDestroy = Opc == TII->getCallFrameDestroyOpcode();
244   uint64_t CalleePopAmount = IsDestroy ? I->getOperand(1).getImm() : 0;
245 
246   const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
247   if (!TFI->hasReservedCallFrame(MF)) {
248     unsigned Align = getStackAlignment();
249 
250     int64_t Amount = I->getOperand(0).getImm();
251     Amount = alignTo(Amount, Align);
252     if (!IsDestroy)
253       Amount = -Amount;
254 
255     // N.b. if CalleePopAmount is valid but zero (i.e. callee would pop, but it
256     // doesn't have to pop anything), then the first operand will be zero too so
257     // this adjustment is a no-op.
258     if (CalleePopAmount == 0) {
259       // FIXME: in-function stack adjustment for calls is limited to 24-bits
260       // because there's no guaranteed temporary register available.
261       //
262       // ADD/SUB (immediate) has only LSL #0 and LSL #12 available.
263       // 1) For offset <= 12-bit, we use LSL #0
264       // 2) For 12-bit <= offset <= 24-bit, we use two instructions. One uses
265       // LSL #0, and the other uses LSL #12.
266       //
267       // Most call frames will be allocated at the start of a function so
268       // this is OK, but it is a limitation that needs dealing with.
269       assert(Amount > -0xffffff && Amount < 0xffffff && "call frame too large");
270       emitFrameOffset(MBB, I, DL, AArch64::SP, AArch64::SP, Amount, TII);
271     }
272   } else if (CalleePopAmount != 0) {
273     // If the calling convention demands that the callee pops arguments from the
274     // stack, we want to add it back if we have a reserved call frame.
275     assert(CalleePopAmount < 0xffffff && "call frame too large");
276     emitFrameOffset(MBB, I, DL, AArch64::SP, AArch64::SP, -CalleePopAmount,
277                     TII);
278   }
279   return MBB.erase(I);
280 }
281 
282 void AArch64FrameLowering::emitCalleeSavedFrameMoves(
283     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const {
284   MachineFunction &MF = *MBB.getParent();
285   MachineFrameInfo &MFI = MF.getFrameInfo();
286   const TargetSubtargetInfo &STI = MF.getSubtarget();
287   const MCRegisterInfo *MRI = STI.getRegisterInfo();
288   const TargetInstrInfo *TII = STI.getInstrInfo();
289   DebugLoc DL = MBB.findDebugLoc(MBBI);
290 
291   // Add callee saved registers to move list.
292   const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
293   if (CSI.empty())
294     return;
295 
296   for (const auto &Info : CSI) {
297     unsigned Reg = Info.getReg();
298     int64_t Offset =
299         MFI.getObjectOffset(Info.getFrameIdx()) - getOffsetOfLocalArea();
300     unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
301     unsigned CFIIndex = MF.addFrameInst(
302         MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset));
303     BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
304         .addCFIIndex(CFIIndex)
305         .setMIFlags(MachineInstr::FrameSetup);
306   }
307 }
308 
309 // Find a scratch register that we can use at the start of the prologue to
310 // re-align the stack pointer.  We avoid using callee-save registers since they
311 // may appear to be free when this is called from canUseAsPrologue (during
312 // shrink wrapping), but then no longer be free when this is called from
313 // emitPrologue.
314 //
315 // FIXME: This is a bit conservative, since in the above case we could use one
316 // of the callee-save registers as a scratch temp to re-align the stack pointer,
317 // but we would then have to make sure that we were in fact saving at least one
318 // callee-save register in the prologue, which is additional complexity that
319 // doesn't seem worth the benefit.
320 static unsigned findScratchNonCalleeSaveRegister(MachineBasicBlock *MBB) {
321   MachineFunction *MF = MBB->getParent();
322 
323   // If MBB is an entry block, use X9 as the scratch register
324   if (&MF->front() == MBB)
325     return AArch64::X9;
326 
327   const AArch64Subtarget &Subtarget = MF->getSubtarget<AArch64Subtarget>();
328   const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo();
329   LivePhysRegs LiveRegs(TRI);
330   LiveRegs.addLiveIns(*MBB);
331 
332   // Mark callee saved registers as used so we will not choose them.
333   const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(MF);
334   for (unsigned i = 0; CSRegs[i]; ++i)
335     LiveRegs.addReg(CSRegs[i]);
336 
337   // Prefer X9 since it was historically used for the prologue scratch reg.
338   const MachineRegisterInfo &MRI = MF->getRegInfo();
339   if (LiveRegs.available(MRI, AArch64::X9))
340     return AArch64::X9;
341 
342   for (unsigned Reg : AArch64::GPR64RegClass) {
343     if (LiveRegs.available(MRI, Reg))
344       return Reg;
345   }
346   return AArch64::NoRegister;
347 }
348 
349 bool AArch64FrameLowering::canUseAsPrologue(
350     const MachineBasicBlock &MBB) const {
351   const MachineFunction *MF = MBB.getParent();
352   MachineBasicBlock *TmpMBB = const_cast<MachineBasicBlock *>(&MBB);
353   const AArch64Subtarget &Subtarget = MF->getSubtarget<AArch64Subtarget>();
354   const AArch64RegisterInfo *RegInfo = Subtarget.getRegisterInfo();
355 
356   // Don't need a scratch register if we're not going to re-align the stack.
357   if (!RegInfo->needsStackRealignment(*MF))
358     return true;
359   // Otherwise, we can use any block as long as it has a scratch register
360   // available.
361   return findScratchNonCalleeSaveRegister(TmpMBB) != AArch64::NoRegister;
362 }
363 
364 static bool windowsRequiresStackProbe(MachineFunction &MF,
365                                       unsigned StackSizeInBytes) {
366   const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
367   if (!Subtarget.isTargetWindows())
368     return false;
369   const Function &F = MF.getFunction();
370   // TODO: When implementing stack protectors, take that into account
371   // for the probe threshold.
372   unsigned StackProbeSize = 4096;
373   if (F.hasFnAttribute("stack-probe-size"))
374     F.getFnAttribute("stack-probe-size")
375         .getValueAsString()
376         .getAsInteger(0, StackProbeSize);
377   return (StackSizeInBytes >= StackProbeSize) &&
378          !F.hasFnAttribute("no-stack-arg-probe");
379 }
380 
381 bool AArch64FrameLowering::shouldCombineCSRLocalStackBump(
382     MachineFunction &MF, unsigned StackBumpBytes) const {
383   AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
384   const MachineFrameInfo &MFI = MF.getFrameInfo();
385   const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
386   const AArch64RegisterInfo *RegInfo = Subtarget.getRegisterInfo();
387 
388   if (AFI->getLocalStackSize() == 0)
389     return false;
390 
391   // 512 is the maximum immediate for stp/ldp that will be used for
392   // callee-save save/restores
393   if (StackBumpBytes >= 512 || windowsRequiresStackProbe(MF, StackBumpBytes))
394     return false;
395 
396   if (MFI.hasVarSizedObjects())
397     return false;
398 
399   if (RegInfo->needsStackRealignment(MF))
400     return false;
401 
402   // This isn't strictly necessary, but it simplifies things a bit since the
403   // current RedZone handling code assumes the SP is adjusted by the
404   // callee-save save/restore code.
405   if (canUseRedZone(MF))
406     return false;
407 
408   return true;
409 }
410 
411 // Convert callee-save register save/restore instruction to do stack pointer
412 // decrement/increment to allocate/deallocate the callee-save stack area by
413 // converting store/load to use pre/post increment version.
414 static MachineBasicBlock::iterator convertCalleeSaveRestoreToSPPrePostIncDec(
415     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
416     const DebugLoc &DL, const TargetInstrInfo *TII, int CSStackSizeInc) {
417   unsigned NewOpc;
418   bool NewIsUnscaled = false;
419   switch (MBBI->getOpcode()) {
420   default:
421     llvm_unreachable("Unexpected callee-save save/restore opcode!");
422   case AArch64::STPXi:
423     NewOpc = AArch64::STPXpre;
424     break;
425   case AArch64::STPDi:
426     NewOpc = AArch64::STPDpre;
427     break;
428   case AArch64::STRXui:
429     NewOpc = AArch64::STRXpre;
430     NewIsUnscaled = true;
431     break;
432   case AArch64::STRDui:
433     NewOpc = AArch64::STRDpre;
434     NewIsUnscaled = true;
435     break;
436   case AArch64::LDPXi:
437     NewOpc = AArch64::LDPXpost;
438     break;
439   case AArch64::LDPDi:
440     NewOpc = AArch64::LDPDpost;
441     break;
442   case AArch64::LDRXui:
443     NewOpc = AArch64::LDRXpost;
444     NewIsUnscaled = true;
445     break;
446   case AArch64::LDRDui:
447     NewOpc = AArch64::LDRDpost;
448     NewIsUnscaled = true;
449     break;
450   }
451 
452   MachineInstrBuilder MIB = BuildMI(MBB, MBBI, DL, TII->get(NewOpc));
453   MIB.addReg(AArch64::SP, RegState::Define);
454 
455   // Copy all operands other than the immediate offset.
456   unsigned OpndIdx = 0;
457   for (unsigned OpndEnd = MBBI->getNumOperands() - 1; OpndIdx < OpndEnd;
458        ++OpndIdx)
459     MIB.add(MBBI->getOperand(OpndIdx));
460 
461   assert(MBBI->getOperand(OpndIdx).getImm() == 0 &&
462          "Unexpected immediate offset in first/last callee-save save/restore "
463          "instruction!");
464   assert(MBBI->getOperand(OpndIdx - 1).getReg() == AArch64::SP &&
465          "Unexpected base register in callee-save save/restore instruction!");
466   // Last operand is immediate offset that needs fixing.
467   assert(CSStackSizeInc % 8 == 0);
468   int64_t CSStackSizeIncImm = CSStackSizeInc;
469   if (!NewIsUnscaled)
470     CSStackSizeIncImm /= 8;
471   MIB.addImm(CSStackSizeIncImm);
472 
473   MIB.setMIFlags(MBBI->getFlags());
474   MIB.setMemRefs(MBBI->memoperands_begin(), MBBI->memoperands_end());
475 
476   return std::prev(MBB.erase(MBBI));
477 }
478 
479 // Fixup callee-save register save/restore instructions to take into account
480 // combined SP bump by adding the local stack size to the stack offsets.
481 static void fixupCalleeSaveRestoreStackOffset(MachineInstr &MI,
482                                               unsigned LocalStackSize) {
483   unsigned Opc = MI.getOpcode();
484   (void)Opc;
485   assert((Opc == AArch64::STPXi || Opc == AArch64::STPDi ||
486           Opc == AArch64::STRXui || Opc == AArch64::STRDui ||
487           Opc == AArch64::LDPXi || Opc == AArch64::LDPDi ||
488           Opc == AArch64::LDRXui || Opc == AArch64::LDRDui) &&
489          "Unexpected callee-save save/restore opcode!");
490 
491   unsigned OffsetIdx = MI.getNumExplicitOperands() - 1;
492   assert(MI.getOperand(OffsetIdx - 1).getReg() == AArch64::SP &&
493          "Unexpected base register in callee-save save/restore instruction!");
494   // Last operand is immediate offset that needs fixing.
495   MachineOperand &OffsetOpnd = MI.getOperand(OffsetIdx);
496   // All generated opcodes have scaled offsets.
497   assert(LocalStackSize % 8 == 0);
498   OffsetOpnd.setImm(OffsetOpnd.getImm() + LocalStackSize / 8);
499 }
500 
501 void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
502                                         MachineBasicBlock &MBB) const {
503   MachineBasicBlock::iterator MBBI = MBB.begin();
504   const MachineFrameInfo &MFI = MF.getFrameInfo();
505   const Function &F = MF.getFunction();
506   const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
507   const AArch64RegisterInfo *RegInfo = Subtarget.getRegisterInfo();
508   const TargetInstrInfo *TII = Subtarget.getInstrInfo();
509   MachineModuleInfo &MMI = MF.getMMI();
510   AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
511   bool needsFrameMoves = MMI.hasDebugInfo() || F.needsUnwindTableEntry();
512   bool HasFP = hasFP(MF);
513 
514   // Debug location must be unknown since the first debug location is used
515   // to determine the end of the prologue.
516   DebugLoc DL;
517 
518   // All calls are tail calls in GHC calling conv, and functions have no
519   // prologue/epilogue.
520   if (MF.getFunction().getCallingConv() == CallingConv::GHC)
521     return;
522 
523   int NumBytes = (int)MFI.getStackSize();
524   if (!AFI->hasStackFrame() && !windowsRequiresStackProbe(MF, NumBytes)) {
525     assert(!HasFP && "unexpected function without stack frame but with FP");
526 
527     // All of the stack allocation is for locals.
528     AFI->setLocalStackSize(NumBytes);
529 
530     if (!NumBytes)
531       return;
532     // REDZONE: If the stack size is less than 128 bytes, we don't need
533     // to actually allocate.
534     if (canUseRedZone(MF))
535       ++NumRedZoneFunctions;
536     else {
537       emitFrameOffset(MBB, MBBI, DL, AArch64::SP, AArch64::SP, -NumBytes, TII,
538                       MachineInstr::FrameSetup);
539 
540       // Label used to tie together the PROLOG_LABEL and the MachineMoves.
541       MCSymbol *FrameLabel = MMI.getContext().createTempSymbol();
542       // Encode the stack size of the leaf function.
543       unsigned CFIIndex = MF.addFrameInst(
544           MCCFIInstruction::createDefCfaOffset(FrameLabel, -NumBytes));
545       BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
546           .addCFIIndex(CFIIndex)
547           .setMIFlags(MachineInstr::FrameSetup);
548     }
549     return;
550   }
551 
552   bool IsWin64 =
553       Subtarget.isCallingConvWin64(MF.getFunction().getCallingConv());
554   unsigned FixedObject = IsWin64 ? alignTo(AFI->getVarArgsGPRSize(), 16) : 0;
555 
556   auto PrologueSaveSize = AFI->getCalleeSavedStackSize() + FixedObject;
557   // All of the remaining stack allocations are for locals.
558   AFI->setLocalStackSize(NumBytes - PrologueSaveSize);
559 
560   bool CombineSPBump = shouldCombineCSRLocalStackBump(MF, NumBytes);
561   if (CombineSPBump) {
562     emitFrameOffset(MBB, MBBI, DL, AArch64::SP, AArch64::SP, -NumBytes, TII,
563                     MachineInstr::FrameSetup);
564     NumBytes = 0;
565   } else if (PrologueSaveSize != 0) {
566     MBBI = convertCalleeSaveRestoreToSPPrePostIncDec(MBB, MBBI, DL, TII,
567                                                      -PrologueSaveSize);
568     NumBytes -= PrologueSaveSize;
569   }
570   assert(NumBytes >= 0 && "Negative stack allocation size!?");
571 
572   // Move past the saves of the callee-saved registers, fixing up the offsets
573   // and pre-inc if we decided to combine the callee-save and local stack
574   // pointer bump above.
575   MachineBasicBlock::iterator End = MBB.end();
576   while (MBBI != End && MBBI->getFlag(MachineInstr::FrameSetup)) {
577     if (CombineSPBump)
578       fixupCalleeSaveRestoreStackOffset(*MBBI, AFI->getLocalStackSize());
579     ++MBBI;
580   }
581   if (HasFP) {
582     // Only set up FP if we actually need to. Frame pointer is fp =
583     // sp - fixedobject - 16.
584     int FPOffset = AFI->getCalleeSavedStackSize() - 16;
585     if (CombineSPBump)
586       FPOffset += AFI->getLocalStackSize();
587 
588     // Issue    sub fp, sp, FPOffset or
589     //          mov fp,sp          when FPOffset is zero.
590     // Note: All stores of callee-saved registers are marked as "FrameSetup".
591     // This code marks the instruction(s) that set the FP also.
592     emitFrameOffset(MBB, MBBI, DL, AArch64::FP, AArch64::SP, FPOffset, TII,
593                     MachineInstr::FrameSetup);
594   }
595 
596   if (windowsRequiresStackProbe(MF, NumBytes)) {
597     uint32_t NumWords = NumBytes >> 4;
598 
599     BuildMI(MBB, MBBI, DL, TII->get(AArch64::MOVi64imm), AArch64::X15)
600         .addImm(NumWords)
601         .setMIFlags(MachineInstr::FrameSetup);
602 
603     switch (MF.getTarget().getCodeModel()) {
604     case CodeModel::Small:
605     case CodeModel::Medium:
606     case CodeModel::Kernel:
607       BuildMI(MBB, MBBI, DL, TII->get(AArch64::BL))
608           .addExternalSymbol("__chkstk")
609           .addReg(AArch64::X15, RegState::Implicit)
610           .setMIFlags(MachineInstr::FrameSetup);
611       break;
612     case CodeModel::Large:
613       BuildMI(MBB, MBBI, DL, TII->get(AArch64::MOVaddrEXT))
614           .addReg(AArch64::X16, RegState::Define)
615           .addExternalSymbol("__chkstk")
616           .addExternalSymbol("__chkstk")
617           .setMIFlags(MachineInstr::FrameSetup);
618 
619       BuildMI(MBB, MBBI, DL, TII->get(AArch64::BLR))
620           .addReg(AArch64::X16, RegState::Kill)
621           .addReg(AArch64::X15, RegState::Implicit | RegState::Define)
622           .setMIFlags(MachineInstr::FrameSetup);
623       break;
624     }
625 
626     BuildMI(MBB, MBBI, DL, TII->get(AArch64::SUBXrx64), AArch64::SP)
627         .addReg(AArch64::SP, RegState::Kill)
628         .addReg(AArch64::X15, RegState::Kill)
629         .addImm(AArch64_AM::getArithExtendImm(AArch64_AM::UXTX, 4))
630         .setMIFlags(MachineInstr::FrameSetup);
631     NumBytes = 0;
632   }
633 
634   // Allocate space for the rest of the frame.
635   if (NumBytes) {
636     const bool NeedsRealignment = RegInfo->needsStackRealignment(MF);
637     unsigned scratchSPReg = AArch64::SP;
638 
639     if (NeedsRealignment) {
640       scratchSPReg = findScratchNonCalleeSaveRegister(&MBB);
641       assert(scratchSPReg != AArch64::NoRegister);
642     }
643 
644     // If we're a leaf function, try using the red zone.
645     if (!canUseRedZone(MF))
646       // FIXME: in the case of dynamic re-alignment, NumBytes doesn't have
647       // the correct value here, as NumBytes also includes padding bytes,
648       // which shouldn't be counted here.
649       emitFrameOffset(MBB, MBBI, DL, scratchSPReg, AArch64::SP, -NumBytes, TII,
650                       MachineInstr::FrameSetup);
651 
652     if (NeedsRealignment) {
653       const unsigned Alignment = MFI.getMaxAlignment();
654       const unsigned NrBitsToZero = countTrailingZeros(Alignment);
655       assert(NrBitsToZero > 1);
656       assert(scratchSPReg != AArch64::SP);
657 
658       // SUB X9, SP, NumBytes
659       //   -- X9 is temporary register, so shouldn't contain any live data here,
660       //   -- free to use. This is already produced by emitFrameOffset above.
661       // AND SP, X9, 0b11111...0000
662       // The logical immediates have a non-trivial encoding. The following
663       // formula computes the encoded immediate with all ones but
664       // NrBitsToZero zero bits as least significant bits.
665       uint32_t andMaskEncoded = (1 << 12)                         // = N
666                                 | ((64 - NrBitsToZero) << 6)      // immr
667                                 | ((64 - NrBitsToZero - 1) << 0); // imms
668 
669       BuildMI(MBB, MBBI, DL, TII->get(AArch64::ANDXri), AArch64::SP)
670           .addReg(scratchSPReg, RegState::Kill)
671           .addImm(andMaskEncoded);
672       AFI->setStackRealigned(true);
673     }
674   }
675 
676   // If we need a base pointer, set it up here. It's whatever the value of the
677   // stack pointer is at this point. Any variable size objects will be allocated
678   // after this, so we can still use the base pointer to reference locals.
679   //
680   // FIXME: Clarify FrameSetup flags here.
681   // Note: Use emitFrameOffset() like above for FP if the FrameSetup flag is
682   // needed.
683   if (RegInfo->hasBasePointer(MF)) {
684     TII->copyPhysReg(MBB, MBBI, DL, RegInfo->getBaseRegister(), AArch64::SP,
685                      false);
686   }
687 
688   if (needsFrameMoves) {
689     const DataLayout &TD = MF.getDataLayout();
690     const int StackGrowth = -TD.getPointerSize(0);
691     unsigned FramePtr = RegInfo->getFrameRegister(MF);
692     // An example of the prologue:
693     //
694     //     .globl __foo
695     //     .align 2
696     //  __foo:
697     // Ltmp0:
698     //     .cfi_startproc
699     //     .cfi_personality 155, ___gxx_personality_v0
700     // Leh_func_begin:
701     //     .cfi_lsda 16, Lexception33
702     //
703     //     stp  xa,bx, [sp, -#offset]!
704     //     ...
705     //     stp  x28, x27, [sp, #offset-32]
706     //     stp  fp, lr, [sp, #offset-16]
707     //     add  fp, sp, #offset - 16
708     //     sub  sp, sp, #1360
709     //
710     // The Stack:
711     //       +-------------------------------------------+
712     // 10000 | ........ | ........ | ........ | ........ |
713     // 10004 | ........ | ........ | ........ | ........ |
714     //       +-------------------------------------------+
715     // 10008 | ........ | ........ | ........ | ........ |
716     // 1000c | ........ | ........ | ........ | ........ |
717     //       +===========================================+
718     // 10010 |                X28 Register               |
719     // 10014 |                X28 Register               |
720     //       +-------------------------------------------+
721     // 10018 |                X27 Register               |
722     // 1001c |                X27 Register               |
723     //       +===========================================+
724     // 10020 |                Frame Pointer              |
725     // 10024 |                Frame Pointer              |
726     //       +-------------------------------------------+
727     // 10028 |                Link Register              |
728     // 1002c |                Link Register              |
729     //       +===========================================+
730     // 10030 | ........ | ........ | ........ | ........ |
731     // 10034 | ........ | ........ | ........ | ........ |
732     //       +-------------------------------------------+
733     // 10038 | ........ | ........ | ........ | ........ |
734     // 1003c | ........ | ........ | ........ | ........ |
735     //       +-------------------------------------------+
736     //
737     //     [sp] = 10030        ::    >>initial value<<
738     //     sp = 10020          ::  stp fp, lr, [sp, #-16]!
739     //     fp = sp == 10020    ::  mov fp, sp
740     //     [sp] == 10020       ::  stp x28, x27, [sp, #-16]!
741     //     sp == 10010         ::    >>final value<<
742     //
743     // The frame pointer (w29) points to address 10020. If we use an offset of
744     // '16' from 'w29', we get the CFI offsets of -8 for w30, -16 for w29, -24
745     // for w27, and -32 for w28:
746     //
747     //  Ltmp1:
748     //     .cfi_def_cfa w29, 16
749     //  Ltmp2:
750     //     .cfi_offset w30, -8
751     //  Ltmp3:
752     //     .cfi_offset w29, -16
753     //  Ltmp4:
754     //     .cfi_offset w27, -24
755     //  Ltmp5:
756     //     .cfi_offset w28, -32
757 
758     if (HasFP) {
759       // Define the current CFA rule to use the provided FP.
760       unsigned Reg = RegInfo->getDwarfRegNum(FramePtr, true);
761       unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfa(
762           nullptr, Reg, 2 * StackGrowth - FixedObject));
763       BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
764           .addCFIIndex(CFIIndex)
765           .setMIFlags(MachineInstr::FrameSetup);
766     } else {
767       // Encode the stack size of the leaf function.
768       unsigned CFIIndex = MF.addFrameInst(
769           MCCFIInstruction::createDefCfaOffset(nullptr, -MFI.getStackSize()));
770       BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
771           .addCFIIndex(CFIIndex)
772           .setMIFlags(MachineInstr::FrameSetup);
773     }
774 
775     // Now emit the moves for whatever callee saved regs we have (including FP,
776     // LR if those are saved).
777     emitCalleeSavedFrameMoves(MBB, MBBI);
778   }
779 }
780 
781 void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
782                                         MachineBasicBlock &MBB) const {
783   MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
784   MachineFrameInfo &MFI = MF.getFrameInfo();
785   const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
786   const TargetInstrInfo *TII = Subtarget.getInstrInfo();
787   DebugLoc DL;
788   bool IsTailCallReturn = false;
789   if (MBB.end() != MBBI) {
790     DL = MBBI->getDebugLoc();
791     unsigned RetOpcode = MBBI->getOpcode();
792     IsTailCallReturn = RetOpcode == AArch64::TCRETURNdi ||
793       RetOpcode == AArch64::TCRETURNri;
794   }
795   int NumBytes = MFI.getStackSize();
796   const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
797 
798   // All calls are tail calls in GHC calling conv, and functions have no
799   // prologue/epilogue.
800   if (MF.getFunction().getCallingConv() == CallingConv::GHC)
801     return;
802 
803   // Initial and residual are named for consistency with the prologue. Note that
804   // in the epilogue, the residual adjustment is executed first.
805   uint64_t ArgumentPopSize = 0;
806   if (IsTailCallReturn) {
807     MachineOperand &StackAdjust = MBBI->getOperand(1);
808 
809     // For a tail-call in a callee-pops-arguments environment, some or all of
810     // the stack may actually be in use for the call's arguments, this is
811     // calculated during LowerCall and consumed here...
812     ArgumentPopSize = StackAdjust.getImm();
813   } else {
814     // ... otherwise the amount to pop is *all* of the argument space,
815     // conveniently stored in the MachineFunctionInfo by
816     // LowerFormalArguments. This will, of course, be zero for the C calling
817     // convention.
818     ArgumentPopSize = AFI->getArgumentStackToRestore();
819   }
820 
821   // The stack frame should be like below,
822   //
823   //      ----------------------                     ---
824   //      |                    |                      |
825   //      | BytesInStackArgArea|              CalleeArgStackSize
826   //      | (NumReusableBytes) |                (of tail call)
827   //      |                    |                     ---
828   //      |                    |                      |
829   //      ---------------------|        ---           |
830   //      |                    |         |            |
831   //      |   CalleeSavedReg   |         |            |
832   //      | (CalleeSavedStackSize)|      |            |
833   //      |                    |         |            |
834   //      ---------------------|         |         NumBytes
835   //      |                    |     StackSize  (StackAdjustUp)
836   //      |   LocalStackSize   |         |            |
837   //      | (covering callee   |         |            |
838   //      |       args)        |         |            |
839   //      |                    |         |            |
840   //      ----------------------        ---          ---
841   //
842   // So NumBytes = StackSize + BytesInStackArgArea - CalleeArgStackSize
843   //             = StackSize + ArgumentPopSize
844   //
845   // AArch64TargetLowering::LowerCall figures out ArgumentPopSize and keeps
846   // it as the 2nd argument of AArch64ISD::TC_RETURN.
847 
848   bool IsWin64 =
849       Subtarget.isCallingConvWin64(MF.getFunction().getCallingConv());
850   unsigned FixedObject = IsWin64 ? alignTo(AFI->getVarArgsGPRSize(), 16) : 0;
851 
852   uint64_t AfterCSRPopSize = ArgumentPopSize;
853   auto PrologueSaveSize = AFI->getCalleeSavedStackSize() + FixedObject;
854   bool CombineSPBump = shouldCombineCSRLocalStackBump(MF, NumBytes);
855   // Assume we can't combine the last pop with the sp restore.
856 
857   if (!CombineSPBump && PrologueSaveSize != 0) {
858     MachineBasicBlock::iterator Pop = std::prev(MBB.getFirstTerminator());
859     // Converting the last ldp to a post-index ldp is valid only if the last
860     // ldp's offset is 0.
861     const MachineOperand &OffsetOp = Pop->getOperand(Pop->getNumOperands() - 1);
862     // If the offset is 0, convert it to a post-index ldp.
863     if (OffsetOp.getImm() == 0) {
864       convertCalleeSaveRestoreToSPPrePostIncDec(MBB, Pop, DL, TII,
865                                                 PrologueSaveSize);
866     } else {
867       // If not, make sure to emit an add after the last ldp.
868       // We're doing this by transfering the size to be restored from the
869       // adjustment *before* the CSR pops to the adjustment *after* the CSR
870       // pops.
871       AfterCSRPopSize += PrologueSaveSize;
872     }
873   }
874 
875   // Move past the restores of the callee-saved registers.
876   // If we plan on combining the sp bump of the local stack size and the callee
877   // save stack size, we might need to adjust the CSR save and restore offsets.
878   MachineBasicBlock::iterator LastPopI = MBB.getFirstTerminator();
879   MachineBasicBlock::iterator Begin = MBB.begin();
880   while (LastPopI != Begin) {
881     --LastPopI;
882     if (!LastPopI->getFlag(MachineInstr::FrameDestroy)) {
883       ++LastPopI;
884       break;
885     } else if (CombineSPBump)
886       fixupCalleeSaveRestoreStackOffset(*LastPopI, AFI->getLocalStackSize());
887   }
888 
889   // If there is a single SP update, insert it before the ret and we're done.
890   if (CombineSPBump) {
891     emitFrameOffset(MBB, MBB.getFirstTerminator(), DL, AArch64::SP, AArch64::SP,
892                     NumBytes + AfterCSRPopSize, TII,
893                     MachineInstr::FrameDestroy);
894     return;
895   }
896 
897   NumBytes -= PrologueSaveSize;
898   assert(NumBytes >= 0 && "Negative stack allocation size!?");
899 
900   if (!hasFP(MF)) {
901     bool RedZone = canUseRedZone(MF);
902     // If this was a redzone leaf function, we don't need to restore the
903     // stack pointer (but we may need to pop stack args for fastcc).
904     if (RedZone && AfterCSRPopSize == 0)
905       return;
906 
907     bool NoCalleeSaveRestore = PrologueSaveSize == 0;
908     int StackRestoreBytes = RedZone ? 0 : NumBytes;
909     if (NoCalleeSaveRestore)
910       StackRestoreBytes += AfterCSRPopSize;
911     emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::SP,
912                     StackRestoreBytes, TII, MachineInstr::FrameDestroy);
913     // If we were able to combine the local stack pop with the argument pop,
914     // then we're done.
915     if (NoCalleeSaveRestore || AfterCSRPopSize == 0)
916       return;
917     NumBytes = 0;
918   }
919 
920   // Restore the original stack pointer.
921   // FIXME: Rather than doing the math here, we should instead just use
922   // non-post-indexed loads for the restores if we aren't actually going to
923   // be able to save any instructions.
924   if (MFI.hasVarSizedObjects() || AFI->isStackRealigned())
925     emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::FP,
926                     -AFI->getCalleeSavedStackSize() + 16, TII,
927                     MachineInstr::FrameDestroy);
928   else if (NumBytes)
929     emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::SP, NumBytes, TII,
930                     MachineInstr::FrameDestroy);
931 
932   // This must be placed after the callee-save restore code because that code
933   // assumes the SP is at the same location as it was after the callee-save save
934   // code in the prologue.
935   if (AfterCSRPopSize) {
936     // Sometimes (when we restore in the same order as we save), we can end up
937     // with code like this:
938     //
939     // ldp      x26, x25, [sp]
940     // ldp      x24, x23, [sp, #16]
941     // ldp      x22, x21, [sp, #32]
942     // ldp      x20, x19, [sp, #48]
943     // add      sp, sp, #64
944     //
945     // In this case, it is always better to put the first ldp at the end, so
946     // that the load-store optimizer can run and merge the ldp and the add into
947     // a post-index ldp.
948     // If we managed to grab the first pop instruction, move it to the end.
949     if (LastPopI != Begin)
950       MBB.splice(MBB.getFirstTerminator(), &MBB, LastPopI);
951     // We should end up with something like this now:
952     //
953     // ldp      x24, x23, [sp, #16]
954     // ldp      x22, x21, [sp, #32]
955     // ldp      x20, x19, [sp, #48]
956     // ldp      x26, x25, [sp]
957     // add      sp, sp, #64
958     //
959     // and the load-store optimizer can merge the last two instructions into:
960     //
961     // ldp      x26, x25, [sp], #64
962     //
963     emitFrameOffset(MBB, MBB.getFirstTerminator(), DL, AArch64::SP, AArch64::SP,
964                     AfterCSRPopSize, TII, MachineInstr::FrameDestroy);
965   }
966 }
967 
968 /// getFrameIndexReference - Provide a base+offset reference to an FI slot for
969 /// debug info.  It's the same as what we use for resolving the code-gen
970 /// references for now.  FIXME: This can go wrong when references are
971 /// SP-relative and simple call frames aren't used.
972 int AArch64FrameLowering::getFrameIndexReference(const MachineFunction &MF,
973                                                  int FI,
974                                                  unsigned &FrameReg) const {
975   return resolveFrameIndexReference(MF, FI, FrameReg);
976 }
977 
978 int AArch64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
979                                                      int FI, unsigned &FrameReg,
980                                                      bool PreferFP) const {
981   const MachineFrameInfo &MFI = MF.getFrameInfo();
982   const AArch64RegisterInfo *RegInfo = static_cast<const AArch64RegisterInfo *>(
983       MF.getSubtarget().getRegisterInfo());
984   const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
985   const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
986   bool IsWin64 =
987       Subtarget.isCallingConvWin64(MF.getFunction().getCallingConv());
988   unsigned FixedObject = IsWin64 ? alignTo(AFI->getVarArgsGPRSize(), 16) : 0;
989   int FPOffset = MFI.getObjectOffset(FI) + FixedObject + 16;
990   int Offset = MFI.getObjectOffset(FI) + MFI.getStackSize();
991   bool isFixed = MFI.isFixedObjectIndex(FI);
992 
993   // Use frame pointer to reference fixed objects. Use it for locals if
994   // there are VLAs or a dynamically realigned SP (and thus the SP isn't
995   // reliable as a base). Make sure useFPForScavengingIndex() does the
996   // right thing for the emergency spill slot.
997   bool UseFP = false;
998   if (AFI->hasStackFrame()) {
999     // Note: Keeping the following as multiple 'if' statements rather than
1000     // merging to a single expression for readability.
1001     //
1002     // Argument access should always use the FP.
1003     if (isFixed) {
1004       UseFP = hasFP(MF);
1005     } else if (hasFP(MF) && !RegInfo->hasBasePointer(MF) &&
1006                !RegInfo->needsStackRealignment(MF)) {
1007       // Use SP or FP, whichever gives us the best chance of the offset
1008       // being in range for direct access. If the FPOffset is positive,
1009       // that'll always be best, as the SP will be even further away.
1010       // If the FPOffset is negative, we have to keep in mind that the
1011       // available offset range for negative offsets is smaller than for
1012       // positive ones. If we have variable sized objects, we're stuck with
1013       // using the FP regardless, though, as the SP offset is unknown
1014       // and we don't have a base pointer available. If an offset is
1015       // available via the FP and the SP, use whichever is closest.
1016       if (PreferFP || MFI.hasVarSizedObjects() || FPOffset >= 0 ||
1017           (FPOffset >= -256 && Offset > -FPOffset))
1018         UseFP = true;
1019     }
1020   }
1021 
1022   assert((isFixed || !RegInfo->needsStackRealignment(MF) || !UseFP) &&
1023          "In the presence of dynamic stack pointer realignment, "
1024          "non-argument objects cannot be accessed through the frame pointer");
1025 
1026   if (UseFP) {
1027     FrameReg = RegInfo->getFrameRegister(MF);
1028     return FPOffset;
1029   }
1030 
1031   // Use the base pointer if we have one.
1032   if (RegInfo->hasBasePointer(MF))
1033     FrameReg = RegInfo->getBaseRegister();
1034   else {
1035     FrameReg = AArch64::SP;
1036     // If we're using the red zone for this function, the SP won't actually
1037     // be adjusted, so the offsets will be negative. They're also all
1038     // within range of the signed 9-bit immediate instructions.
1039     if (canUseRedZone(MF))
1040       Offset -= AFI->getLocalStackSize();
1041   }
1042 
1043   return Offset;
1044 }
1045 
1046 static unsigned getPrologueDeath(MachineFunction &MF, unsigned Reg) {
1047   // Do not set a kill flag on values that are also marked as live-in. This
1048   // happens with the @llvm-returnaddress intrinsic and with arguments passed in
1049   // callee saved registers.
1050   // Omitting the kill flags is conservatively correct even if the live-in
1051   // is not used after all.
1052   bool IsLiveIn = MF.getRegInfo().isLiveIn(Reg);
1053   return getKillRegState(!IsLiveIn);
1054 }
1055 
1056 static bool produceCompactUnwindFrame(MachineFunction &MF) {
1057   const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
1058   AttributeList Attrs = MF.getFunction().getAttributes();
1059   return Subtarget.isTargetMachO() &&
1060          !(Subtarget.getTargetLowering()->supportSwiftError() &&
1061            Attrs.hasAttrSomewhere(Attribute::SwiftError));
1062 }
1063 
1064 namespace {
1065 
1066 struct RegPairInfo {
1067   unsigned Reg1 = AArch64::NoRegister;
1068   unsigned Reg2 = AArch64::NoRegister;
1069   int FrameIdx;
1070   int Offset;
1071   bool IsGPR;
1072 
1073   RegPairInfo() = default;
1074 
1075   bool isPaired() const { return Reg2 != AArch64::NoRegister; }
1076 };
1077 
1078 } // end anonymous namespace
1079 
1080 static void computeCalleeSaveRegisterPairs(
1081     MachineFunction &MF, const std::vector<CalleeSavedInfo> &CSI,
1082     const TargetRegisterInfo *TRI, SmallVectorImpl<RegPairInfo> &RegPairs) {
1083 
1084   if (CSI.empty())
1085     return;
1086 
1087   AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
1088   MachineFrameInfo &MFI = MF.getFrameInfo();
1089   CallingConv::ID CC = MF.getFunction().getCallingConv();
1090   unsigned Count = CSI.size();
1091   (void)CC;
1092   // MachO's compact unwind format relies on all registers being stored in
1093   // pairs.
1094   assert((!produceCompactUnwindFrame(MF) ||
1095           CC == CallingConv::PreserveMost ||
1096           (Count & 1) == 0) &&
1097          "Odd number of callee-saved regs to spill!");
1098   int Offset = AFI->getCalleeSavedStackSize();
1099 
1100   for (unsigned i = 0; i < Count; ++i) {
1101     RegPairInfo RPI;
1102     RPI.Reg1 = CSI[i].getReg();
1103 
1104     assert(AArch64::GPR64RegClass.contains(RPI.Reg1) ||
1105            AArch64::FPR64RegClass.contains(RPI.Reg1));
1106     RPI.IsGPR = AArch64::GPR64RegClass.contains(RPI.Reg1);
1107 
1108     // Add the next reg to the pair if it is in the same register class.
1109     if (i + 1 < Count) {
1110       unsigned NextReg = CSI[i + 1].getReg();
1111       if ((RPI.IsGPR && AArch64::GPR64RegClass.contains(NextReg)) ||
1112           (!RPI.IsGPR && AArch64::FPR64RegClass.contains(NextReg)))
1113         RPI.Reg2 = NextReg;
1114     }
1115 
1116     // GPRs and FPRs are saved in pairs of 64-bit regs. We expect the CSI
1117     // list to come in sorted by frame index so that we can issue the store
1118     // pair instructions directly. Assert if we see anything otherwise.
1119     //
1120     // The order of the registers in the list is controlled by
1121     // getCalleeSavedRegs(), so they will always be in-order, as well.
1122     assert((!RPI.isPaired() ||
1123             (CSI[i].getFrameIdx() + 1 == CSI[i + 1].getFrameIdx())) &&
1124            "Out of order callee saved regs!");
1125 
1126     // MachO's compact unwind format relies on all registers being stored in
1127     // adjacent register pairs.
1128     assert((!produceCompactUnwindFrame(MF) ||
1129             CC == CallingConv::PreserveMost ||
1130             (RPI.isPaired() &&
1131              ((RPI.Reg1 == AArch64::LR && RPI.Reg2 == AArch64::FP) ||
1132               RPI.Reg1 + 1 == RPI.Reg2))) &&
1133            "Callee-save registers not saved as adjacent register pair!");
1134 
1135     RPI.FrameIdx = CSI[i].getFrameIdx();
1136 
1137     if (Count * 8 != AFI->getCalleeSavedStackSize() && !RPI.isPaired()) {
1138       // Round up size of non-pair to pair size if we need to pad the
1139       // callee-save area to ensure 16-byte alignment.
1140       Offset -= 16;
1141       assert(MFI.getObjectAlignment(RPI.FrameIdx) <= 16);
1142       MFI.setObjectAlignment(RPI.FrameIdx, 16);
1143       AFI->setCalleeSaveStackHasFreeSpace(true);
1144     } else
1145       Offset -= RPI.isPaired() ? 16 : 8;
1146     assert(Offset % 8 == 0);
1147     RPI.Offset = Offset / 8;
1148     assert((RPI.Offset >= -64 && RPI.Offset <= 63) &&
1149            "Offset out of bounds for LDP/STP immediate");
1150 
1151     RegPairs.push_back(RPI);
1152     if (RPI.isPaired())
1153       ++i;
1154   }
1155 }
1156 
1157 bool AArch64FrameLowering::spillCalleeSavedRegisters(
1158     MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1159     const std::vector<CalleeSavedInfo> &CSI,
1160     const TargetRegisterInfo *TRI) const {
1161   MachineFunction &MF = *MBB.getParent();
1162   const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
1163   DebugLoc DL;
1164   SmallVector<RegPairInfo, 8> RegPairs;
1165 
1166   computeCalleeSaveRegisterPairs(MF, CSI, TRI, RegPairs);
1167   const MachineRegisterInfo &MRI = MF.getRegInfo();
1168 
1169   for (auto RPII = RegPairs.rbegin(), RPIE = RegPairs.rend(); RPII != RPIE;
1170        ++RPII) {
1171     RegPairInfo RPI = *RPII;
1172     unsigned Reg1 = RPI.Reg1;
1173     unsigned Reg2 = RPI.Reg2;
1174     unsigned StrOpc;
1175 
1176     // Issue sequence of spills for cs regs.  The first spill may be converted
1177     // to a pre-decrement store later by emitPrologue if the callee-save stack
1178     // area allocation can't be combined with the local stack area allocation.
1179     // For example:
1180     //    stp     x22, x21, [sp, #0]     // addImm(+0)
1181     //    stp     x20, x19, [sp, #16]    // addImm(+2)
1182     //    stp     fp, lr, [sp, #32]      // addImm(+4)
1183     // Rationale: This sequence saves uop updates compared to a sequence of
1184     // pre-increment spills like stp xi,xj,[sp,#-16]!
1185     // Note: Similar rationale and sequence for restores in epilog.
1186     if (RPI.IsGPR)
1187       StrOpc = RPI.isPaired() ? AArch64::STPXi : AArch64::STRXui;
1188     else
1189       StrOpc = RPI.isPaired() ? AArch64::STPDi : AArch64::STRDui;
1190     DEBUG(dbgs() << "CSR spill: (" << printReg(Reg1, TRI);
1191           if (RPI.isPaired())
1192             dbgs() << ", " << printReg(Reg2, TRI);
1193           dbgs() << ") -> fi#(" << RPI.FrameIdx;
1194           if (RPI.isPaired())
1195             dbgs() << ", " << RPI.FrameIdx+1;
1196           dbgs() << ")\n");
1197 
1198     MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(StrOpc));
1199     if (!MRI.isReserved(Reg1))
1200       MBB.addLiveIn(Reg1);
1201     if (RPI.isPaired()) {
1202       if (!MRI.isReserved(Reg2))
1203         MBB.addLiveIn(Reg2);
1204       MIB.addReg(Reg2, getPrologueDeath(MF, Reg2));
1205       MIB.addMemOperand(MF.getMachineMemOperand(
1206           MachinePointerInfo::getFixedStack(MF, RPI.FrameIdx + 1),
1207           MachineMemOperand::MOStore, 8, 8));
1208     }
1209     MIB.addReg(Reg1, getPrologueDeath(MF, Reg1))
1210         .addReg(AArch64::SP)
1211         .addImm(RPI.Offset) // [sp, #offset*8], where factor*8 is implicit
1212         .setMIFlag(MachineInstr::FrameSetup);
1213     MIB.addMemOperand(MF.getMachineMemOperand(
1214         MachinePointerInfo::getFixedStack(MF, RPI.FrameIdx),
1215         MachineMemOperand::MOStore, 8, 8));
1216   }
1217   return true;
1218 }
1219 
1220 bool AArch64FrameLowering::restoreCalleeSavedRegisters(
1221     MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1222     std::vector<CalleeSavedInfo> &CSI,
1223     const TargetRegisterInfo *TRI) const {
1224   MachineFunction &MF = *MBB.getParent();
1225   const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
1226   DebugLoc DL;
1227   SmallVector<RegPairInfo, 8> RegPairs;
1228 
1229   if (MI != MBB.end())
1230     DL = MI->getDebugLoc();
1231 
1232   computeCalleeSaveRegisterPairs(MF, CSI, TRI, RegPairs);
1233 
1234   auto EmitMI = [&](const RegPairInfo &RPI) {
1235     unsigned Reg1 = RPI.Reg1;
1236     unsigned Reg2 = RPI.Reg2;
1237 
1238     // Issue sequence of restores for cs regs. The last restore may be converted
1239     // to a post-increment load later by emitEpilogue if the callee-save stack
1240     // area allocation can't be combined with the local stack area allocation.
1241     // For example:
1242     //    ldp     fp, lr, [sp, #32]       // addImm(+4)
1243     //    ldp     x20, x19, [sp, #16]     // addImm(+2)
1244     //    ldp     x22, x21, [sp, #0]      // addImm(+0)
1245     // Note: see comment in spillCalleeSavedRegisters()
1246     unsigned LdrOpc;
1247     if (RPI.IsGPR)
1248       LdrOpc = RPI.isPaired() ? AArch64::LDPXi : AArch64::LDRXui;
1249     else
1250       LdrOpc = RPI.isPaired() ? AArch64::LDPDi : AArch64::LDRDui;
1251     DEBUG(dbgs() << "CSR restore: (" << printReg(Reg1, TRI);
1252           if (RPI.isPaired())
1253             dbgs() << ", " << printReg(Reg2, TRI);
1254           dbgs() << ") -> fi#(" << RPI.FrameIdx;
1255           if (RPI.isPaired())
1256             dbgs() << ", " << RPI.FrameIdx+1;
1257           dbgs() << ")\n");
1258 
1259     MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(LdrOpc));
1260     if (RPI.isPaired()) {
1261       MIB.addReg(Reg2, getDefRegState(true));
1262       MIB.addMemOperand(MF.getMachineMemOperand(
1263           MachinePointerInfo::getFixedStack(MF, RPI.FrameIdx + 1),
1264           MachineMemOperand::MOLoad, 8, 8));
1265     }
1266     MIB.addReg(Reg1, getDefRegState(true))
1267         .addReg(AArch64::SP)
1268         .addImm(RPI.Offset) // [sp, #offset*8] where the factor*8 is implicit
1269         .setMIFlag(MachineInstr::FrameDestroy);
1270     MIB.addMemOperand(MF.getMachineMemOperand(
1271         MachinePointerInfo::getFixedStack(MF, RPI.FrameIdx),
1272         MachineMemOperand::MOLoad, 8, 8));
1273   };
1274 
1275   if (ReverseCSRRestoreSeq)
1276     for (const RegPairInfo &RPI : reverse(RegPairs))
1277       EmitMI(RPI);
1278   else
1279     for (const RegPairInfo &RPI : RegPairs)
1280       EmitMI(RPI);
1281   return true;
1282 }
1283 
1284 void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
1285                                                 BitVector &SavedRegs,
1286                                                 RegScavenger *RS) const {
1287   // All calls are tail calls in GHC calling conv, and functions have no
1288   // prologue/epilogue.
1289   if (MF.getFunction().getCallingConv() == CallingConv::GHC)
1290     return;
1291 
1292   TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS);
1293   const AArch64RegisterInfo *RegInfo = static_cast<const AArch64RegisterInfo *>(
1294       MF.getSubtarget().getRegisterInfo());
1295   AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
1296   unsigned UnspilledCSGPR = AArch64::NoRegister;
1297   unsigned UnspilledCSGPRPaired = AArch64::NoRegister;
1298 
1299   MachineFrameInfo &MFI = MF.getFrameInfo();
1300   const MCPhysReg *CSRegs = RegInfo->getCalleeSavedRegs(&MF);
1301 
1302   unsigned BasePointerReg = RegInfo->hasBasePointer(MF)
1303                                 ? RegInfo->getBaseRegister()
1304                                 : (unsigned)AArch64::NoRegister;
1305 
1306   unsigned SpillEstimate = SavedRegs.count();
1307   for (unsigned i = 0; CSRegs[i]; ++i) {
1308     unsigned Reg = CSRegs[i];
1309     unsigned PairedReg = CSRegs[i ^ 1];
1310     if (Reg == BasePointerReg)
1311       SpillEstimate++;
1312     if (produceCompactUnwindFrame(MF) && !SavedRegs.test(PairedReg))
1313       SpillEstimate++;
1314   }
1315   SpillEstimate += 2; // Conservatively include FP+LR in the estimate
1316   unsigned StackEstimate = MFI.estimateStackSize(MF) + 8 * SpillEstimate;
1317 
1318   // The frame record needs to be created by saving the appropriate registers
1319   if (hasFP(MF) || windowsRequiresStackProbe(MF, StackEstimate)) {
1320     SavedRegs.set(AArch64::FP);
1321     SavedRegs.set(AArch64::LR);
1322   }
1323 
1324   unsigned ExtraCSSpill = 0;
1325   // Figure out which callee-saved registers to save/restore.
1326   for (unsigned i = 0; CSRegs[i]; ++i) {
1327     const unsigned Reg = CSRegs[i];
1328 
1329     // Add the base pointer register to SavedRegs if it is callee-save.
1330     if (Reg == BasePointerReg)
1331       SavedRegs.set(Reg);
1332 
1333     bool RegUsed = SavedRegs.test(Reg);
1334     unsigned PairedReg = CSRegs[i ^ 1];
1335     if (!RegUsed) {
1336       if (AArch64::GPR64RegClass.contains(Reg) &&
1337           !RegInfo->isReservedReg(MF, Reg)) {
1338         UnspilledCSGPR = Reg;
1339         UnspilledCSGPRPaired = PairedReg;
1340       }
1341       continue;
1342     }
1343 
1344     // MachO's compact unwind format relies on all registers being stored in
1345     // pairs.
1346     // FIXME: the usual format is actually better if unwinding isn't needed.
1347     if (produceCompactUnwindFrame(MF) && !SavedRegs.test(PairedReg)) {
1348       SavedRegs.set(PairedReg);
1349       if (AArch64::GPR64RegClass.contains(PairedReg) &&
1350           !RegInfo->isReservedReg(MF, PairedReg))
1351         ExtraCSSpill = PairedReg;
1352     }
1353   }
1354 
1355   DEBUG(dbgs() << "*** determineCalleeSaves\nUsed CSRs:";
1356         for (unsigned Reg : SavedRegs.set_bits())
1357           dbgs() << ' ' << printReg(Reg, RegInfo);
1358         dbgs() << "\n";);
1359 
1360   // If any callee-saved registers are used, the frame cannot be eliminated.
1361   unsigned NumRegsSpilled = SavedRegs.count();
1362   bool CanEliminateFrame = NumRegsSpilled == 0;
1363 
1364   // The CSR spill slots have not been allocated yet, so estimateStackSize
1365   // won't include them.
1366   unsigned CFSize = MFI.estimateStackSize(MF) + 8 * NumRegsSpilled;
1367   DEBUG(dbgs() << "Estimated stack frame size: " << CFSize << " bytes.\n");
1368   unsigned EstimatedStackSizeLimit = estimateRSStackSizeLimit(MF);
1369   bool BigStack = (CFSize > EstimatedStackSizeLimit);
1370   if (BigStack || !CanEliminateFrame || RegInfo->cannotEliminateFrame(MF))
1371     AFI->setHasStackFrame(true);
1372 
1373   // Estimate if we might need to scavenge a register at some point in order
1374   // to materialize a stack offset. If so, either spill one additional
1375   // callee-saved register or reserve a special spill slot to facilitate
1376   // register scavenging. If we already spilled an extra callee-saved register
1377   // above to keep the number of spills even, we don't need to do anything else
1378   // here.
1379   if (BigStack) {
1380     if (!ExtraCSSpill && UnspilledCSGPR != AArch64::NoRegister) {
1381       DEBUG(dbgs() << "Spilling " << printReg(UnspilledCSGPR, RegInfo)
1382                    << " to get a scratch register.\n");
1383       SavedRegs.set(UnspilledCSGPR);
1384       // MachO's compact unwind format relies on all registers being stored in
1385       // pairs, so if we need to spill one extra for BigStack, then we need to
1386       // store the pair.
1387       if (produceCompactUnwindFrame(MF))
1388         SavedRegs.set(UnspilledCSGPRPaired);
1389       ExtraCSSpill = UnspilledCSGPRPaired;
1390       NumRegsSpilled = SavedRegs.count();
1391     }
1392 
1393     // If we didn't find an extra callee-saved register to spill, create
1394     // an emergency spill slot.
1395     if (!ExtraCSSpill || MF.getRegInfo().isPhysRegUsed(ExtraCSSpill)) {
1396       const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
1397       const TargetRegisterClass &RC = AArch64::GPR64RegClass;
1398       unsigned Size = TRI->getSpillSize(RC);
1399       unsigned Align = TRI->getSpillAlignment(RC);
1400       int FI = MFI.CreateStackObject(Size, Align, false);
1401       RS->addScavengingFrameIndex(FI);
1402       DEBUG(dbgs() << "No available CS registers, allocated fi#" << FI
1403                    << " as the emergency spill slot.\n");
1404     }
1405   }
1406 
1407   // Round up to register pair alignment to avoid additional SP adjustment
1408   // instructions.
1409   AFI->setCalleeSavedStackSize(alignTo(8 * NumRegsSpilled, 16));
1410 }
1411 
1412 bool AArch64FrameLowering::enableStackSlotScavenging(
1413     const MachineFunction &MF) const {
1414   const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
1415   return AFI->hasCalleeSaveStackFreeSpace();
1416 }
1417