xref: /freebsd/contrib/llvm-project/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp (revision aa1a8ff2d6dbc51ef058f46f3db5a8bb77967145)
1 //===- Thumb1FrameLowering.cpp - Thumb1 Frame Information -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains the Thumb1 implementation of TargetFrameLowering class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "Thumb1FrameLowering.h"
14 #include "ARMBaseInstrInfo.h"
15 #include "ARMBaseRegisterInfo.h"
16 #include "ARMMachineFunctionInfo.h"
17 #include "ARMSubtarget.h"
18 #include "Thumb1InstrInfo.h"
19 #include "ThumbRegisterInfo.h"
20 #include "Utils/ARMBaseInfo.h"
21 #include "llvm/ADT/BitVector.h"
22 #include "llvm/ADT/STLExtras.h"
23 #include "llvm/ADT/SmallVector.h"
24 #include "llvm/CodeGen/LivePhysRegs.h"
25 #include "llvm/CodeGen/MachineBasicBlock.h"
26 #include "llvm/CodeGen/MachineFrameInfo.h"
27 #include "llvm/CodeGen/MachineFunction.h"
28 #include "llvm/CodeGen/MachineInstr.h"
29 #include "llvm/CodeGen/MachineInstrBuilder.h"
30 #include "llvm/CodeGen/MachineModuleInfo.h"
31 #include "llvm/CodeGen/MachineOperand.h"
32 #include "llvm/CodeGen/MachineRegisterInfo.h"
33 #include "llvm/CodeGen/TargetInstrInfo.h"
34 #include "llvm/CodeGen/TargetOpcodes.h"
35 #include "llvm/CodeGen/TargetSubtargetInfo.h"
36 #include "llvm/IR/DebugLoc.h"
37 #include "llvm/MC/MCContext.h"
38 #include "llvm/MC/MCDwarf.h"
39 #include "llvm/MC/MCRegisterInfo.h"
40 #include "llvm/Support/Compiler.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/MathExtras.h"
43 #include <cassert>
44 #include <iterator>
45 #include <vector>
46 
47 using namespace llvm;
48 
49 Thumb1FrameLowering::Thumb1FrameLowering(const ARMSubtarget &sti)
50     : ARMFrameLowering(sti) {}
51 
52 bool Thumb1FrameLowering::hasReservedCallFrame(const MachineFunction &MF) const{
53   const MachineFrameInfo &MFI = MF.getFrameInfo();
54   unsigned CFSize = MFI.getMaxCallFrameSize();
55   // It's not always a good idea to include the call frame as part of the
56   // stack frame. ARM (especially Thumb) has small immediate offset to
57   // address the stack frame. So a large call frame can cause poor codegen
58   // and may even makes it impossible to scavenge a register.
59   if (CFSize >= ((1 << 8) - 1) * 4 / 2) // Half of imm8 * 4
60     return false;
61 
62   return !MFI.hasVarSizedObjects();
63 }
64 
65 static void
66 emitPrologueEpilogueSPUpdate(MachineBasicBlock &MBB,
67                              MachineBasicBlock::iterator &MBBI,
68                              const TargetInstrInfo &TII, const DebugLoc &dl,
69                              const ThumbRegisterInfo &MRI, int NumBytes,
70                              unsigned ScratchReg, unsigned MIFlags) {
71   // If it would take more than three instructions to adjust the stack pointer
72   // using tADDspi/tSUBspi, load an immediate instead.
73   if (std::abs(NumBytes) > 508 * 3) {
74     // We use a different codepath here from the normal
75     // emitThumbRegPlusImmediate so we don't have to deal with register
76     // scavenging. (Scavenging could try to use the emergency spill slot
77     // before we've actually finished setting up the stack.)
78     if (ScratchReg == ARM::NoRegister)
79       report_fatal_error("Failed to emit Thumb1 stack adjustment");
80     MachineFunction &MF = *MBB.getParent();
81     const ARMSubtarget &ST = MF.getSubtarget<ARMSubtarget>();
82     if (ST.genExecuteOnly()) {
83       unsigned XOInstr = ST.useMovt() ? ARM::t2MOVi32imm : ARM::tMOVi32imm;
84       BuildMI(MBB, MBBI, dl, TII.get(XOInstr), ScratchReg)
85           .addImm(NumBytes).setMIFlags(MIFlags);
86     } else {
87       MRI.emitLoadConstPool(MBB, MBBI, dl, ScratchReg, 0, NumBytes, ARMCC::AL,
88                             0, MIFlags);
89     }
90     BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDhirr), ARM::SP)
91         .addReg(ARM::SP)
92         .addReg(ScratchReg, RegState::Kill)
93         .add(predOps(ARMCC::AL))
94         .setMIFlags(MIFlags);
95     return;
96   }
97   // FIXME: This is assuming the heuristics in emitThumbRegPlusImmediate
98   // won't change.
99   emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes, TII,
100                             MRI, MIFlags);
101 
102 }
103 
104 static void emitCallSPUpdate(MachineBasicBlock &MBB,
105                              MachineBasicBlock::iterator &MBBI,
106                              const TargetInstrInfo &TII, const DebugLoc &dl,
107                              const ThumbRegisterInfo &MRI, int NumBytes,
108                              unsigned MIFlags = MachineInstr::NoFlags) {
109   emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes, TII,
110                             MRI, MIFlags);
111 }
112 
113 
114 MachineBasicBlock::iterator Thumb1FrameLowering::
115 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
116                               MachineBasicBlock::iterator I) const {
117   const Thumb1InstrInfo &TII =
118       *static_cast<const Thumb1InstrInfo *>(STI.getInstrInfo());
119   const ThumbRegisterInfo *RegInfo =
120       static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());
121   if (!hasReservedCallFrame(MF)) {
122     // If we have alloca, convert as follows:
123     // ADJCALLSTACKDOWN -> sub, sp, sp, amount
124     // ADJCALLSTACKUP   -> add, sp, sp, amount
125     MachineInstr &Old = *I;
126     DebugLoc dl = Old.getDebugLoc();
127     unsigned Amount = TII.getFrameSize(Old);
128     if (Amount != 0) {
129       // We need to keep the stack aligned properly.  To do this, we round the
130       // amount of space needed for the outgoing arguments up to the next
131       // alignment boundary.
132       Amount = alignTo(Amount, getStackAlign());
133 
134       // Replace the pseudo instruction with a new instruction...
135       unsigned Opc = Old.getOpcode();
136       if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) {
137         emitCallSPUpdate(MBB, I, TII, dl, *RegInfo, -Amount);
138       } else {
139         assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP);
140         emitCallSPUpdate(MBB, I, TII, dl, *RegInfo, Amount);
141       }
142     }
143   }
144   return MBB.erase(I);
145 }
146 
147 void Thumb1FrameLowering::emitPrologue(MachineFunction &MF,
148                                        MachineBasicBlock &MBB) const {
149   MachineBasicBlock::iterator MBBI = MBB.begin();
150   MachineFrameInfo &MFI = MF.getFrameInfo();
151   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
152   MachineModuleInfo &MMI = MF.getMMI();
153   const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
154   const ThumbRegisterInfo *RegInfo =
155       static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());
156   const Thumb1InstrInfo &TII =
157       *static_cast<const Thumb1InstrInfo *>(STI.getInstrInfo());
158 
159   unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize();
160   unsigned NumBytes = MFI.getStackSize();
161   assert(NumBytes >= ArgRegsSaveSize &&
162          "ArgRegsSaveSize is included in NumBytes");
163   const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
164 
165   // Debug location must be unknown since the first debug location is used
166   // to determine the end of the prologue.
167   DebugLoc dl;
168 
169   Register FramePtr = RegInfo->getFrameRegister(MF);
170   Register BasePtr = RegInfo->getBaseRegister();
171   int CFAOffset = 0;
172 
173   // Thumb add/sub sp, imm8 instructions implicitly multiply the offset by 4.
174   NumBytes = (NumBytes + 3) & ~3;
175   MFI.setStackSize(NumBytes);
176 
177   // Determine the sizes of each callee-save spill areas and record which frame
178   // belongs to which callee-save spill areas.
179   unsigned FRSize = 0, GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0;
180   int FramePtrSpillFI = 0;
181 
182   if (ArgRegsSaveSize) {
183     emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize,
184                                  ARM::NoRegister, MachineInstr::FrameSetup);
185     CFAOffset += ArgRegsSaveSize;
186     unsigned CFIIndex =
187         MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, CFAOffset));
188     BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
189         .addCFIIndex(CFIIndex)
190         .setMIFlags(MachineInstr::FrameSetup);
191   }
192 
193   if (!AFI->hasStackFrame()) {
194     if (NumBytes - ArgRegsSaveSize != 0) {
195       emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo,
196                                    -(NumBytes - ArgRegsSaveSize),
197                                    ARM::NoRegister, MachineInstr::FrameSetup);
198       CFAOffset += NumBytes - ArgRegsSaveSize;
199       unsigned CFIIndex = MF.addFrameInst(
200           MCCFIInstruction::cfiDefCfaOffset(nullptr, CFAOffset));
201       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
202           .addCFIIndex(CFIIndex)
203           .setMIFlags(MachineInstr::FrameSetup);
204     }
205     return;
206   }
207 
208   bool HasFrameRecordArea = hasFP(MF) && ARM::hGPRRegClass.contains(FramePtr);
209 
210   for (const CalleeSavedInfo &I : CSI) {
211     Register Reg = I.getReg();
212     int FI = I.getFrameIdx();
213     if (Reg == FramePtr)
214       FramePtrSpillFI = FI;
215     switch (Reg) {
216     case ARM::R11:
217       if (HasFrameRecordArea) {
218         FRSize += 4;
219         break;
220       }
221       [[fallthrough]];
222     case ARM::R8:
223     case ARM::R9:
224     case ARM::R10:
225       if (STI.splitFramePushPop(MF)) {
226         GPRCS2Size += 4;
227         break;
228       }
229       [[fallthrough]];
230     case ARM::LR:
231       if (HasFrameRecordArea) {
232         FRSize += 4;
233         break;
234       }
235       [[fallthrough]];
236     case ARM::R4:
237     case ARM::R5:
238     case ARM::R6:
239     case ARM::R7:
240       GPRCS1Size += 4;
241       break;
242     default:
243       DPRCSSize += 8;
244     }
245   }
246 
247   MachineBasicBlock::iterator FRPush, GPRCS1Push, GPRCS2Push;
248   if (HasFrameRecordArea) {
249     // Skip Frame Record setup:
250     //   push {lr}
251     //   mov lr, r11
252     //   push {lr}
253     std::advance(MBBI, 2);
254     FRPush = MBBI++;
255   }
256 
257   if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH) {
258     GPRCS1Push = MBBI;
259     ++MBBI;
260   }
261 
262   // Find last push instruction for GPRCS2 - spilling of high registers
263   // (r8-r11) could consist of multiple tPUSH and tMOVr instructions.
264   while (true) {
265     MachineBasicBlock::iterator OldMBBI = MBBI;
266     // Skip a run of tMOVr instructions
267     while (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tMOVr &&
268            MBBI->getFlag(MachineInstr::FrameSetup))
269       MBBI++;
270     if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH &&
271         MBBI->getFlag(MachineInstr::FrameSetup)) {
272       GPRCS2Push = MBBI;
273       MBBI++;
274     } else {
275       // We have reached an instruction which is not a push, so the previous
276       // run of tMOVr instructions (which may have been empty) was not part of
277       // the prologue. Reset MBBI back to the last PUSH of the prologue.
278       MBBI = OldMBBI;
279       break;
280     }
281   }
282 
283   // Determine starting offsets of spill areas.
284   unsigned DPRCSOffset = NumBytes - ArgRegsSaveSize -
285                          (FRSize + GPRCS1Size + GPRCS2Size + DPRCSSize);
286   unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize;
287   unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size;
288   bool HasFP = hasFP(MF);
289   if (HasFP)
290     AFI->setFramePtrSpillOffset(MFI.getObjectOffset(FramePtrSpillFI) +
291                                 NumBytes);
292   if (HasFrameRecordArea)
293     AFI->setFrameRecordSavedAreaSize(FRSize);
294   AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset);
295   AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset);
296   AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset);
297   NumBytes = DPRCSOffset;
298 
299   int FramePtrOffsetInBlock = 0;
300   unsigned adjustedGPRCS1Size = GPRCS1Size;
301   if (GPRCS1Size > 0 && GPRCS2Size == 0 &&
302       tryFoldSPUpdateIntoPushPop(STI, MF, &*(GPRCS1Push), NumBytes)) {
303     FramePtrOffsetInBlock = NumBytes;
304     adjustedGPRCS1Size += NumBytes;
305     NumBytes = 0;
306   }
307   CFAOffset += adjustedGPRCS1Size;
308 
309   // Adjust FP so it point to the stack slot that contains the previous FP.
310   if (HasFP) {
311     MachineBasicBlock::iterator AfterPush =
312         HasFrameRecordArea ? std::next(FRPush) : std::next(GPRCS1Push);
313     if (HasFrameRecordArea) {
314       // We have just finished pushing the previous FP into the stack,
315       // so simply capture the SP value as the new Frame Pointer.
316       BuildMI(MBB, AfterPush, dl, TII.get(ARM::tMOVr), FramePtr)
317           .addReg(ARM::SP)
318           .setMIFlags(MachineInstr::FrameSetup)
319           .add(predOps(ARMCC::AL));
320     } else {
321       FramePtrOffsetInBlock +=
322           MFI.getObjectOffset(FramePtrSpillFI) + GPRCS1Size + ArgRegsSaveSize;
323       BuildMI(MBB, AfterPush, dl, TII.get(ARM::tADDrSPi), FramePtr)
324           .addReg(ARM::SP)
325           .addImm(FramePtrOffsetInBlock / 4)
326           .setMIFlags(MachineInstr::FrameSetup)
327           .add(predOps(ARMCC::AL));
328     }
329 
330     if(FramePtrOffsetInBlock) {
331       unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfa(
332           nullptr, MRI->getDwarfRegNum(FramePtr, true), (CFAOffset - FramePtrOffsetInBlock)));
333       BuildMI(MBB, AfterPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
334           .addCFIIndex(CFIIndex)
335           .setMIFlags(MachineInstr::FrameSetup);
336     } else {
337       unsigned CFIIndex =
338           MF.addFrameInst(MCCFIInstruction::createDefCfaRegister(
339               nullptr, MRI->getDwarfRegNum(FramePtr, true)));
340       BuildMI(MBB, AfterPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
341           .addCFIIndex(CFIIndex)
342           .setMIFlags(MachineInstr::FrameSetup);
343     }
344     if (NumBytes > 508)
345       // If offset is > 508 then sp cannot be adjusted in a single instruction,
346       // try restoring from fp instead.
347       AFI->setShouldRestoreSPFromFP(true);
348   }
349 
350   // Emit call frame information for the callee-saved low registers.
351   if (GPRCS1Size > 0) {
352     MachineBasicBlock::iterator Pos = std::next(GPRCS1Push);
353     if (adjustedGPRCS1Size) {
354       unsigned CFIIndex =
355           MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, CFAOffset));
356       BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
357           .addCFIIndex(CFIIndex)
358           .setMIFlags(MachineInstr::FrameSetup);
359     }
360     for (const CalleeSavedInfo &I : CSI) {
361       Register Reg = I.getReg();
362       int FI = I.getFrameIdx();
363       switch (Reg) {
364       case ARM::R8:
365       case ARM::R9:
366       case ARM::R10:
367       case ARM::R11:
368       case ARM::R12:
369         if (STI.splitFramePushPop(MF))
370           break;
371         [[fallthrough]];
372       case ARM::R0:
373       case ARM::R1:
374       case ARM::R2:
375       case ARM::R3:
376       case ARM::R4:
377       case ARM::R5:
378       case ARM::R6:
379       case ARM::R7:
380       case ARM::LR:
381         unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
382             nullptr, MRI->getDwarfRegNum(Reg, true), MFI.getObjectOffset(FI)));
383         BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
384             .addCFIIndex(CFIIndex)
385             .setMIFlags(MachineInstr::FrameSetup);
386         break;
387       }
388     }
389   }
390 
391   // Emit call frame information for the callee-saved high registers.
392   if (GPRCS2Size > 0) {
393     MachineBasicBlock::iterator Pos = std::next(GPRCS2Push);
394     for (auto &I : CSI) {
395       Register Reg = I.getReg();
396       int FI = I.getFrameIdx();
397       switch (Reg) {
398       case ARM::R8:
399       case ARM::R9:
400       case ARM::R10:
401       case ARM::R11:
402       case ARM::R12: {
403         unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
404             nullptr, MRI->getDwarfRegNum(Reg, true), MFI.getObjectOffset(FI)));
405         BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
406             .addCFIIndex(CFIIndex)
407             .setMIFlags(MachineInstr::FrameSetup);
408         break;
409       }
410       default:
411         break;
412       }
413     }
414   }
415 
416   if (NumBytes) {
417     // Insert it after all the callee-save spills.
418     //
419     // For a large stack frame, we might need a scratch register to store
420     // the size of the frame.  We know all callee-save registers are free
421     // at this point in the prologue, so pick one.
422     unsigned ScratchRegister = ARM::NoRegister;
423     for (auto &I : CSI) {
424       Register Reg = I.getReg();
425       if (isARMLowRegister(Reg) && !(HasFP && Reg == FramePtr)) {
426         ScratchRegister = Reg;
427         break;
428       }
429     }
430     emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes,
431                                  ScratchRegister, MachineInstr::FrameSetup);
432     if (!HasFP) {
433       CFAOffset += NumBytes;
434       unsigned CFIIndex = MF.addFrameInst(
435           MCCFIInstruction::cfiDefCfaOffset(nullptr, CFAOffset));
436       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
437           .addCFIIndex(CFIIndex)
438           .setMIFlags(MachineInstr::FrameSetup);
439     }
440   }
441 
442   if (STI.isTargetELF() && HasFP)
443     MFI.setOffsetAdjustment(MFI.getOffsetAdjustment() -
444                             AFI->getFramePtrSpillOffset());
445 
446   AFI->setGPRCalleeSavedArea1Size(GPRCS1Size);
447   AFI->setGPRCalleeSavedArea2Size(GPRCS2Size);
448   AFI->setDPRCalleeSavedAreaSize(DPRCSSize);
449 
450   if (RegInfo->hasStackRealignment(MF)) {
451     const unsigned NrBitsToZero = Log2(MFI.getMaxAlign());
452     // Emit the following sequence, using R4 as a temporary, since we cannot use
453     // SP as a source or destination register for the shifts:
454     // mov  r4, sp
455     // lsrs r4, r4, #NrBitsToZero
456     // lsls r4, r4, #NrBitsToZero
457     // mov  sp, r4
458     BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), ARM::R4)
459       .addReg(ARM::SP, RegState::Kill)
460       .add(predOps(ARMCC::AL));
461 
462     BuildMI(MBB, MBBI, dl, TII.get(ARM::tLSRri), ARM::R4)
463       .addDef(ARM::CPSR)
464       .addReg(ARM::R4, RegState::Kill)
465       .addImm(NrBitsToZero)
466       .add(predOps(ARMCC::AL));
467 
468     BuildMI(MBB, MBBI, dl, TII.get(ARM::tLSLri), ARM::R4)
469       .addDef(ARM::CPSR)
470       .addReg(ARM::R4, RegState::Kill)
471       .addImm(NrBitsToZero)
472       .add(predOps(ARMCC::AL));
473 
474     BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), ARM::SP)
475       .addReg(ARM::R4, RegState::Kill)
476       .add(predOps(ARMCC::AL));
477 
478     AFI->setShouldRestoreSPFromFP(true);
479   }
480 
481   // If we need a base pointer, set it up here. It's whatever the value
482   // of the stack pointer is at this point. Any variable size objects
483   // will be allocated after this, so we can still use the base pointer
484   // to reference locals.
485   if (RegInfo->hasBasePointer(MF))
486     BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), BasePtr)
487         .addReg(ARM::SP)
488         .add(predOps(ARMCC::AL));
489 
490   // If the frame has variable sized objects then the epilogue must restore
491   // the sp from fp. We can assume there's an FP here since hasFP already
492   // checks for hasVarSizedObjects.
493   if (MFI.hasVarSizedObjects())
494     AFI->setShouldRestoreSPFromFP(true);
495 
496   // In some cases, virtual registers have been introduced, e.g. by uses of
497   // emitThumbRegPlusImmInReg.
498   MF.getProperties().reset(MachineFunctionProperties::Property::NoVRegs);
499 }
500 
501 void Thumb1FrameLowering::emitEpilogue(MachineFunction &MF,
502                                    MachineBasicBlock &MBB) const {
503   MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
504   DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
505   MachineFrameInfo &MFI = MF.getFrameInfo();
506   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
507   const ThumbRegisterInfo *RegInfo =
508       static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());
509   const Thumb1InstrInfo &TII =
510       *static_cast<const Thumb1InstrInfo *>(STI.getInstrInfo());
511 
512   unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize();
513   int NumBytes = (int)MFI.getStackSize();
514   assert((unsigned)NumBytes >= ArgRegsSaveSize &&
515          "ArgRegsSaveSize is included in NumBytes");
516   Register FramePtr = RegInfo->getFrameRegister(MF);
517 
518   if (!AFI->hasStackFrame()) {
519     if (NumBytes - ArgRegsSaveSize != 0)
520       emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo,
521                                    NumBytes - ArgRegsSaveSize, ARM::NoRegister,
522                                    MachineInstr::FrameDestroy);
523   } else {
524     // Unwind MBBI to point to first LDR / VLDRD.
525     if (MBBI != MBB.begin()) {
526       do
527         --MBBI;
528       while (MBBI != MBB.begin() && MBBI->getFlag(MachineInstr::FrameDestroy));
529       if (!MBBI->getFlag(MachineInstr::FrameDestroy))
530         ++MBBI;
531     }
532 
533     // Move SP to start of FP callee save spill area.
534     NumBytes -= (AFI->getFrameRecordSavedAreaSize() +
535                  AFI->getGPRCalleeSavedArea1Size() +
536                  AFI->getGPRCalleeSavedArea2Size() +
537                  AFI->getDPRCalleeSavedAreaSize() +
538                  ArgRegsSaveSize);
539 
540     // We are likely to need a scratch register and we know all callee-save
541     // registers are free at this point in the epilogue, so pick one.
542     unsigned ScratchRegister = ARM::NoRegister;
543     bool HasFP = hasFP(MF);
544     for (auto &I : MFI.getCalleeSavedInfo()) {
545       Register Reg = I.getReg();
546       if (isARMLowRegister(Reg) && !(HasFP && Reg == FramePtr)) {
547         ScratchRegister = Reg;
548         break;
549       }
550     }
551 
552     if (AFI->shouldRestoreSPFromFP()) {
553       NumBytes = AFI->getFramePtrSpillOffset() - NumBytes;
554       // Reset SP based on frame pointer only if the stack frame extends beyond
555       // frame pointer stack slot, the target is ELF and the function has FP, or
556       // the target uses var sized objects.
557       if (NumBytes) {
558         assert(ScratchRegister != ARM::NoRegister &&
559                "No scratch register to restore SP from FP!");
560         emitThumbRegPlusImmediate(MBB, MBBI, dl, ScratchRegister, FramePtr, -NumBytes,
561                                   TII, *RegInfo, MachineInstr::FrameDestroy);
562         BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), ARM::SP)
563             .addReg(ScratchRegister)
564             .add(predOps(ARMCC::AL))
565             .setMIFlag(MachineInstr::FrameDestroy);
566       } else
567         BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), ARM::SP)
568             .addReg(FramePtr)
569             .add(predOps(ARMCC::AL))
570             .setMIFlag(MachineInstr::FrameDestroy);
571     } else {
572       if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tBX_RET &&
573           &MBB.front() != &*MBBI && std::prev(MBBI)->getOpcode() == ARM::tPOP) {
574         MachineBasicBlock::iterator PMBBI = std::prev(MBBI);
575         if (!tryFoldSPUpdateIntoPushPop(STI, MF, &*PMBBI, NumBytes))
576           emitPrologueEpilogueSPUpdate(MBB, PMBBI, TII, dl, *RegInfo, NumBytes,
577                                        ScratchRegister, MachineInstr::FrameDestroy);
578       } else if (!tryFoldSPUpdateIntoPushPop(STI, MF, &*MBBI, NumBytes))
579         emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo, NumBytes,
580                                      ScratchRegister, MachineInstr::FrameDestroy);
581     }
582   }
583 
584   if (needPopSpecialFixUp(MF)) {
585     bool Done = emitPopSpecialFixUp(MBB, /* DoIt */ true);
586     (void)Done;
587     assert(Done && "Emission of the special fixup failed!?");
588   }
589 }
590 
591 bool Thumb1FrameLowering::canUseAsEpilogue(const MachineBasicBlock &MBB) const {
592   if (!needPopSpecialFixUp(*MBB.getParent()))
593     return true;
594 
595   MachineBasicBlock *TmpMBB = const_cast<MachineBasicBlock *>(&MBB);
596   return emitPopSpecialFixUp(*TmpMBB, /* DoIt */ false);
597 }
598 
599 bool Thumb1FrameLowering::needPopSpecialFixUp(const MachineFunction &MF) const {
600   ARMFunctionInfo *AFI =
601       const_cast<MachineFunction *>(&MF)->getInfo<ARMFunctionInfo>();
602   if (AFI->getArgRegsSaveSize())
603     return true;
604 
605   // LR cannot be encoded with Thumb1, i.e., it requires a special fix-up.
606   for (const CalleeSavedInfo &CSI : MF.getFrameInfo().getCalleeSavedInfo())
607     if (CSI.getReg() == ARM::LR)
608       return true;
609 
610   return false;
611 }
612 
613 static void findTemporariesForLR(const BitVector &GPRsNoLRSP,
614                                  const BitVector &PopFriendly,
615                                  const LivePhysRegs &UsedRegs, unsigned &PopReg,
616                                  unsigned &TmpReg, MachineRegisterInfo &MRI) {
617   PopReg = TmpReg = 0;
618   for (auto Reg : GPRsNoLRSP.set_bits()) {
619     if (UsedRegs.available(MRI, Reg)) {
620       // Remember the first pop-friendly register and exit.
621       if (PopFriendly.test(Reg)) {
622         PopReg = Reg;
623         TmpReg = 0;
624         break;
625       }
626       // Otherwise, remember that the register will be available to
627       // save a pop-friendly register.
628       TmpReg = Reg;
629     }
630   }
631 }
632 
633 bool Thumb1FrameLowering::emitPopSpecialFixUp(MachineBasicBlock &MBB,
634                                               bool DoIt) const {
635   MachineFunction &MF = *MBB.getParent();
636   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
637   unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize();
638   const TargetInstrInfo &TII = *STI.getInstrInfo();
639   const ThumbRegisterInfo *RegInfo =
640       static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());
641 
642   // If MBBI is a return instruction, or is a tPOP followed by a return
643   // instruction in the successor BB, we may be able to directly restore
644   // LR in the PC.
645   // This is only possible with v5T ops (v4T can't change the Thumb bit via
646   // a POP PC instruction), and only if we do not need to emit any SP update.
647   // Otherwise, we need a temporary register to pop the value
648   // and copy that value into LR.
649   auto MBBI = MBB.getFirstTerminator();
650   bool CanRestoreDirectly = STI.hasV5TOps() && !ArgRegsSaveSize;
651   if (CanRestoreDirectly) {
652     if (MBBI != MBB.end() && MBBI->getOpcode() != ARM::tB)
653       CanRestoreDirectly = (MBBI->getOpcode() == ARM::tBX_RET ||
654                             MBBI->getOpcode() == ARM::tPOP_RET);
655     else {
656       auto MBBI_prev = MBBI;
657       MBBI_prev--;
658       assert(MBBI_prev->getOpcode() == ARM::tPOP);
659       assert(MBB.succ_size() == 1);
660       if ((*MBB.succ_begin())->begin()->getOpcode() == ARM::tBX_RET)
661         MBBI = MBBI_prev; // Replace the final tPOP with a tPOP_RET.
662       else
663         CanRestoreDirectly = false;
664     }
665   }
666 
667   if (CanRestoreDirectly) {
668     if (!DoIt || MBBI->getOpcode() == ARM::tPOP_RET)
669       return true;
670     MachineInstrBuilder MIB =
671         BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII.get(ARM::tPOP_RET))
672             .add(predOps(ARMCC::AL))
673             .setMIFlag(MachineInstr::FrameDestroy);
674     // Copy implicit ops and popped registers, if any.
675     for (auto MO: MBBI->operands())
676       if (MO.isReg() && (MO.isImplicit() || MO.isDef()))
677         MIB.add(MO);
678     MIB.addReg(ARM::PC, RegState::Define);
679     // Erase the old instruction (tBX_RET or tPOP).
680     MBB.erase(MBBI);
681     return true;
682   }
683 
684   // Look for a temporary register to use.
685   // First, compute the liveness information.
686   const TargetRegisterInfo &TRI = *STI.getRegisterInfo();
687   LivePhysRegs UsedRegs(TRI);
688   UsedRegs.addLiveOuts(MBB);
689   // The semantic of pristines changed recently and now,
690   // the callee-saved registers that are touched in the function
691   // are not part of the pristines set anymore.
692   // Add those callee-saved now.
693   const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(&MF);
694   for (unsigned i = 0; CSRegs[i]; ++i)
695     UsedRegs.addReg(CSRegs[i]);
696 
697   DebugLoc dl = DebugLoc();
698   if (MBBI != MBB.end()) {
699     dl = MBBI->getDebugLoc();
700     auto InstUpToMBBI = MBB.end();
701     while (InstUpToMBBI != MBBI)
702       // The pre-decrement is on purpose here.
703       // We want to have the liveness right before MBBI.
704       UsedRegs.stepBackward(*--InstUpToMBBI);
705   }
706 
707   // Look for a register that can be directly use in the POP.
708   unsigned PopReg = 0;
709   // And some temporary register, just in case.
710   unsigned TemporaryReg = 0;
711   BitVector PopFriendly =
712       TRI.getAllocatableSet(MF, TRI.getRegClass(ARM::tGPRRegClassID));
713   // R7 may be used as a frame pointer, hence marked as not generally
714   // allocatable, however there's no reason to not use it as a temporary for
715   // restoring LR.
716   if (STI.getFramePointerReg() == ARM::R7)
717     PopFriendly.set(ARM::R7);
718 
719   assert(PopFriendly.any() && "No allocatable pop-friendly register?!");
720   // Rebuild the GPRs from the high registers because they are removed
721   // form the GPR reg class for thumb1.
722   BitVector GPRsNoLRSP =
723       TRI.getAllocatableSet(MF, TRI.getRegClass(ARM::hGPRRegClassID));
724   GPRsNoLRSP |= PopFriendly;
725   GPRsNoLRSP.reset(ARM::LR);
726   GPRsNoLRSP.reset(ARM::SP);
727   GPRsNoLRSP.reset(ARM::PC);
728   findTemporariesForLR(GPRsNoLRSP, PopFriendly, UsedRegs, PopReg, TemporaryReg,
729                        MF.getRegInfo());
730 
731   // If we couldn't find a pop-friendly register, try restoring LR before
732   // popping the other callee-saved registers, so we could use one of them as a
733   // temporary.
734   bool UseLDRSP = false;
735   if (!PopReg && MBBI != MBB.begin()) {
736     auto PrevMBBI = MBBI;
737     PrevMBBI--;
738     if (PrevMBBI->getOpcode() == ARM::tPOP) {
739       UsedRegs.stepBackward(*PrevMBBI);
740       findTemporariesForLR(GPRsNoLRSP, PopFriendly, UsedRegs, PopReg,
741                            TemporaryReg, MF.getRegInfo());
742       if (PopReg) {
743         MBBI = PrevMBBI;
744         UseLDRSP = true;
745       }
746     }
747   }
748 
749   if (!DoIt && !PopReg && !TemporaryReg)
750     return false;
751 
752   assert((PopReg || TemporaryReg) && "Cannot get LR");
753 
754   if (UseLDRSP) {
755     assert(PopReg && "Do not know how to get LR");
756     // Load the LR via LDR tmp, [SP, #off]
757     BuildMI(MBB, MBBI, dl, TII.get(ARM::tLDRspi))
758       .addReg(PopReg, RegState::Define)
759       .addReg(ARM::SP)
760       .addImm(MBBI->getNumExplicitOperands() - 2)
761       .add(predOps(ARMCC::AL))
762       .setMIFlag(MachineInstr::FrameDestroy);
763     // Move from the temporary register to the LR.
764     BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr))
765       .addReg(ARM::LR, RegState::Define)
766       .addReg(PopReg, RegState::Kill)
767       .add(predOps(ARMCC::AL))
768       .setMIFlag(MachineInstr::FrameDestroy);
769     // Advance past the pop instruction.
770     MBBI++;
771     // Increment the SP.
772     emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo,
773                                  ArgRegsSaveSize + 4, ARM::NoRegister,
774                                  MachineInstr::FrameDestroy);
775     return true;
776   }
777 
778   if (TemporaryReg) {
779     assert(!PopReg && "Unnecessary MOV is about to be inserted");
780     PopReg = PopFriendly.find_first();
781     BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr))
782         .addReg(TemporaryReg, RegState::Define)
783         .addReg(PopReg, RegState::Kill)
784         .add(predOps(ARMCC::AL))
785         .setMIFlag(MachineInstr::FrameDestroy);
786   }
787 
788   if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPOP_RET) {
789     // We couldn't use the direct restoration above, so
790     // perform the opposite conversion: tPOP_RET to tPOP.
791     MachineInstrBuilder MIB =
792         BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII.get(ARM::tPOP))
793             .add(predOps(ARMCC::AL))
794             .setMIFlag(MachineInstr::FrameDestroy);
795     bool Popped = false;
796     for (auto MO: MBBI->operands())
797       if (MO.isReg() && (MO.isImplicit() || MO.isDef()) &&
798           MO.getReg() != ARM::PC) {
799         MIB.add(MO);
800         if (!MO.isImplicit())
801           Popped = true;
802       }
803     // Is there anything left to pop?
804     if (!Popped)
805       MBB.erase(MIB.getInstr());
806     // Erase the old instruction.
807     MBB.erase(MBBI);
808     MBBI = BuildMI(MBB, MBB.end(), dl, TII.get(ARM::tBX_RET))
809                .add(predOps(ARMCC::AL))
810                .setMIFlag(MachineInstr::FrameDestroy);
811   }
812 
813   assert(PopReg && "Do not know how to get LR");
814   BuildMI(MBB, MBBI, dl, TII.get(ARM::tPOP))
815       .add(predOps(ARMCC::AL))
816       .addReg(PopReg, RegState::Define)
817       .setMIFlag(MachineInstr::FrameDestroy);
818 
819   emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo, ArgRegsSaveSize,
820                                ARM::NoRegister, MachineInstr::FrameDestroy);
821 
822   BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr))
823       .addReg(ARM::LR, RegState::Define)
824       .addReg(PopReg, RegState::Kill)
825       .add(predOps(ARMCC::AL))
826       .setMIFlag(MachineInstr::FrameDestroy);
827 
828   if (TemporaryReg)
829     BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr))
830         .addReg(PopReg, RegState::Define)
831         .addReg(TemporaryReg, RegState::Kill)
832         .add(predOps(ARMCC::AL))
833         .setMIFlag(MachineInstr::FrameDestroy);
834 
835   return true;
836 }
837 
838 static const SmallVector<Register> OrderedLowRegs = {ARM::R4, ARM::R5, ARM::R6,
839                                                      ARM::R7, ARM::LR};
840 static const SmallVector<Register> OrderedHighRegs = {ARM::R8, ARM::R9,
841                                                       ARM::R10, ARM::R11};
842 static const SmallVector<Register> OrderedCopyRegs = {
843     ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R4,
844     ARM::R5, ARM::R6, ARM::R7, ARM::LR};
845 
846 static void splitLowAndHighRegs(const std::set<Register> &Regs,
847                                 std::set<Register> &LowRegs,
848                                 std::set<Register> &HighRegs) {
849   for (Register Reg : Regs) {
850     if (ARM::tGPRRegClass.contains(Reg) || Reg == ARM::LR) {
851       LowRegs.insert(Reg);
852     } else if (ARM::hGPRRegClass.contains(Reg) && Reg != ARM::LR) {
853       HighRegs.insert(Reg);
854     } else {
855       llvm_unreachable("callee-saved register of unexpected class");
856     }
857   }
858 }
859 
860 template <typename It>
861 It getNextOrderedReg(It OrderedStartIt, It OrderedEndIt,
862                      const std::set<Register> &RegSet) {
863   return std::find_if(OrderedStartIt, OrderedEndIt,
864                       [&](Register Reg) { return RegSet.count(Reg); });
865 }
866 
867 static void pushRegsToStack(MachineBasicBlock &MBB,
868                             MachineBasicBlock::iterator MI,
869                             const TargetInstrInfo &TII,
870                             const std::set<Register> &RegsToSave,
871                             const std::set<Register> &CopyRegs) {
872   MachineFunction &MF = *MBB.getParent();
873   const MachineRegisterInfo &MRI = MF.getRegInfo();
874   DebugLoc DL;
875 
876   std::set<Register> LowRegs, HighRegs;
877   splitLowAndHighRegs(RegsToSave, LowRegs, HighRegs);
878 
879   // Push low regs first
880   if (!LowRegs.empty()) {
881     MachineInstrBuilder MIB =
882         BuildMI(MBB, MI, DL, TII.get(ARM::tPUSH)).add(predOps(ARMCC::AL));
883     for (unsigned Reg : OrderedLowRegs) {
884       if (LowRegs.count(Reg)) {
885         bool isKill = !MRI.isLiveIn(Reg);
886         if (isKill && !MRI.isReserved(Reg))
887           MBB.addLiveIn(Reg);
888 
889         MIB.addReg(Reg, getKillRegState(isKill));
890       }
891     }
892     MIB.setMIFlags(MachineInstr::FrameSetup);
893   }
894 
895   // Now push the high registers
896   // There are no store instructions that can access high registers directly,
897   // so we have to move them to low registers, and push them.
898   // This might take multiple pushes, as it is possible for there to
899   // be fewer low registers available than high registers which need saving.
900 
901   // Find the first register to save.
902   // Registers must be processed in reverse order so that in case we need to use
903   // multiple PUSH instructions, the order of the registers on the stack still
904   // matches the unwind info. They need to be swicthed back to ascending order
905   // before adding to the PUSH instruction.
906   auto HiRegToSave = getNextOrderedReg(OrderedHighRegs.rbegin(),
907                                        OrderedHighRegs.rend(),
908                                        HighRegs);
909 
910   while (HiRegToSave != OrderedHighRegs.rend()) {
911     // Find the first low register to use.
912     auto CopyRegIt = getNextOrderedReg(OrderedCopyRegs.rbegin(),
913                                        OrderedCopyRegs.rend(),
914                                        CopyRegs);
915 
916     // Create the PUSH, but don't insert it yet (the MOVs need to come first).
917     MachineInstrBuilder PushMIB = BuildMI(MF, DL, TII.get(ARM::tPUSH))
918                                       .add(predOps(ARMCC::AL))
919                                       .setMIFlags(MachineInstr::FrameSetup);
920 
921     SmallVector<unsigned, 4> RegsToPush;
922     while (HiRegToSave != OrderedHighRegs.rend() &&
923            CopyRegIt != OrderedCopyRegs.rend()) {
924       if (HighRegs.count(*HiRegToSave)) {
925         bool isKill = !MRI.isLiveIn(*HiRegToSave);
926         if (isKill && !MRI.isReserved(*HiRegToSave))
927           MBB.addLiveIn(*HiRegToSave);
928 
929         // Emit a MOV from the high reg to the low reg.
930         BuildMI(MBB, MI, DL, TII.get(ARM::tMOVr))
931             .addReg(*CopyRegIt, RegState::Define)
932             .addReg(*HiRegToSave, getKillRegState(isKill))
933             .add(predOps(ARMCC::AL))
934             .setMIFlags(MachineInstr::FrameSetup);
935 
936         // Record the register that must be added to the PUSH.
937         RegsToPush.push_back(*CopyRegIt);
938 
939         CopyRegIt = getNextOrderedReg(std::next(CopyRegIt),
940                                       OrderedCopyRegs.rend(),
941                                       CopyRegs);
942         HiRegToSave = getNextOrderedReg(std::next(HiRegToSave),
943                                         OrderedHighRegs.rend(),
944                                         HighRegs);
945       }
946     }
947 
948     // Add the low registers to the PUSH, in ascending order.
949     for (unsigned Reg : llvm::reverse(RegsToPush))
950       PushMIB.addReg(Reg, RegState::Kill);
951 
952     // Insert the PUSH instruction after the MOVs.
953     MBB.insert(MI, PushMIB);
954   }
955 }
956 
957 static void popRegsFromStack(MachineBasicBlock &MBB,
958                              MachineBasicBlock::iterator &MI,
959                              const TargetInstrInfo &TII,
960                              const std::set<Register> &RegsToRestore,
961                              const std::set<Register> &AvailableCopyRegs,
962                              bool IsVarArg, bool HasV5Ops) {
963   if (RegsToRestore.empty())
964     return;
965 
966   MachineFunction &MF = *MBB.getParent();
967   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
968   DebugLoc DL = MI != MBB.end() ? MI->getDebugLoc() : DebugLoc();
969 
970   std::set<Register> LowRegs, HighRegs;
971   splitLowAndHighRegs(RegsToRestore, LowRegs, HighRegs);
972 
973   // Pop the high registers first
974   // There are no store instructions that can access high registers directly,
975   // so we have to pop into low registers and them move to  the high registers.
976   // This might take multiple pops, as it is possible for there to
977   // be fewer low registers available than high registers which need restoring.
978 
979   // Find the first register to restore.
980   auto HiRegToRestore = getNextOrderedReg(OrderedHighRegs.begin(),
981                                           OrderedHighRegs.end(),
982                                           HighRegs);
983 
984   std::set<Register> CopyRegs = AvailableCopyRegs;
985   Register LowScratchReg;
986   if (!HighRegs.empty() && CopyRegs.empty()) {
987     // No copy regs are available to pop high regs. Let's make use of a return
988     // register and the scratch register (IP/R12) to copy things around.
989     LowScratchReg = ARM::R0;
990     BuildMI(MBB, MI, DL, TII.get(ARM::tMOVr))
991         .addReg(ARM::R12, RegState::Define)
992         .addReg(LowScratchReg, RegState::Kill)
993         .add(predOps(ARMCC::AL))
994         .setMIFlag(MachineInstr::FrameDestroy);
995     CopyRegs.insert(LowScratchReg);
996   }
997 
998   while (HiRegToRestore != OrderedHighRegs.end()) {
999     assert(!CopyRegs.empty());
1000     // Find the first low register to use.
1001     auto CopyReg = getNextOrderedReg(OrderedCopyRegs.begin(),
1002                                      OrderedCopyRegs.end(),
1003                                      CopyRegs);
1004 
1005     // Create the POP instruction.
1006     MachineInstrBuilder PopMIB = BuildMI(MBB, MI, DL, TII.get(ARM::tPOP))
1007                                      .add(predOps(ARMCC::AL))
1008                                      .setMIFlag(MachineInstr::FrameDestroy);
1009 
1010     while (HiRegToRestore != OrderedHighRegs.end() &&
1011            CopyReg != OrderedCopyRegs.end()) {
1012       // Add the low register to the POP.
1013       PopMIB.addReg(*CopyReg, RegState::Define);
1014 
1015       // Create the MOV from low to high register.
1016       BuildMI(MBB, MI, DL, TII.get(ARM::tMOVr))
1017           .addReg(*HiRegToRestore, RegState::Define)
1018           .addReg(*CopyReg, RegState::Kill)
1019           .add(predOps(ARMCC::AL))
1020           .setMIFlag(MachineInstr::FrameDestroy);
1021 
1022       CopyReg = getNextOrderedReg(std::next(CopyReg),
1023                                   OrderedCopyRegs.end(),
1024                                   CopyRegs);
1025       HiRegToRestore = getNextOrderedReg(std::next(HiRegToRestore),
1026                                          OrderedHighRegs.end(),
1027                                          HighRegs);
1028     }
1029   }
1030 
1031   // Restore low register used as scratch if necessary
1032   if (LowScratchReg.isValid()) {
1033     BuildMI(MBB, MI, DL, TII.get(ARM::tMOVr))
1034         .addReg(LowScratchReg, RegState::Define)
1035         .addReg(ARM::R12, RegState::Kill)
1036         .add(predOps(ARMCC::AL))
1037         .setMIFlag(MachineInstr::FrameDestroy);
1038   }
1039 
1040   // Now pop the low registers
1041   if (!LowRegs.empty()) {
1042     MachineInstrBuilder MIB = BuildMI(MF, DL, TII.get(ARM::tPOP))
1043                                   .add(predOps(ARMCC::AL))
1044                                   .setMIFlag(MachineInstr::FrameDestroy);
1045 
1046     bool NeedsPop = false;
1047     for (Register Reg : OrderedLowRegs) {
1048       if (!LowRegs.count(Reg))
1049         continue;
1050 
1051       if (Reg == ARM::LR) {
1052         if (!MBB.succ_empty() ||
1053             MI->getOpcode() == ARM::TCRETURNdi ||
1054             MI->getOpcode() == ARM::TCRETURNri)
1055           // LR may only be popped into PC, as part of return sequence.
1056           // If this isn't the return sequence, we'll need emitPopSpecialFixUp
1057           // to restore LR the hard way.
1058           // FIXME: if we don't pass any stack arguments it would be actually
1059           // advantageous *and* correct to do the conversion to an ordinary call
1060           // instruction here.
1061           continue;
1062         // Special epilogue for vararg functions. See emitEpilogue
1063         if (IsVarArg)
1064           continue;
1065         // ARMv4T requires BX, see emitEpilogue
1066         if (!HasV5Ops)
1067           continue;
1068 
1069         // CMSE entry functions must return via BXNS, see emitEpilogue.
1070         if (AFI->isCmseNSEntryFunction())
1071           continue;
1072 
1073         // Pop LR into PC.
1074         Reg = ARM::PC;
1075         (*MIB).setDesc(TII.get(ARM::tPOP_RET));
1076         if (MI != MBB.end())
1077           MIB.copyImplicitOps(*MI);
1078         MI = MBB.erase(MI);
1079       }
1080       MIB.addReg(Reg, getDefRegState(true));
1081       NeedsPop = true;
1082     }
1083 
1084     // It's illegal to emit pop instruction without operands.
1085     if (NeedsPop)
1086       MBB.insert(MI, &*MIB);
1087     else
1088       MF.deleteMachineInstr(MIB);
1089   }
1090 }
1091 
1092 bool Thumb1FrameLowering::spillCalleeSavedRegisters(
1093     MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1094     ArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
1095   if (CSI.empty())
1096     return false;
1097 
1098   const TargetInstrInfo &TII = *STI.getInstrInfo();
1099   MachineFunction &MF = *MBB.getParent();
1100   const ARMBaseRegisterInfo *RegInfo = static_cast<const ARMBaseRegisterInfo *>(
1101       MF.getSubtarget().getRegisterInfo());
1102   Register FPReg = RegInfo->getFrameRegister(MF);
1103 
1104   // In case FP is a high reg, we need a separate push sequence to generate
1105   // a correct Frame Record
1106   bool NeedsFrameRecordPush = hasFP(MF) && ARM::hGPRRegClass.contains(FPReg);
1107 
1108   std::set<Register> FrameRecord;
1109   std::set<Register> SpilledGPRs;
1110   for (const CalleeSavedInfo &I : CSI) {
1111     Register Reg = I.getReg();
1112     if (NeedsFrameRecordPush && (Reg == FPReg || Reg == ARM::LR))
1113       FrameRecord.insert(Reg);
1114     else
1115       SpilledGPRs.insert(Reg);
1116   }
1117 
1118   pushRegsToStack(MBB, MI, TII, FrameRecord, {ARM::LR});
1119 
1120   // Determine intermediate registers which can be used for pushing high regs:
1121   // - Spilled low regs
1122   // - Unused argument registers
1123   std::set<Register> CopyRegs;
1124   for (Register Reg : SpilledGPRs)
1125     if ((ARM::tGPRRegClass.contains(Reg) || Reg == ARM::LR) &&
1126         !MF.getRegInfo().isLiveIn(Reg) && !(hasFP(MF) && Reg == FPReg))
1127       CopyRegs.insert(Reg);
1128   for (unsigned ArgReg : {ARM::R0, ARM::R1, ARM::R2, ARM::R3})
1129     if (!MF.getRegInfo().isLiveIn(ArgReg))
1130       CopyRegs.insert(ArgReg);
1131 
1132   pushRegsToStack(MBB, MI, TII, SpilledGPRs, CopyRegs);
1133 
1134   return true;
1135 }
1136 
1137 bool Thumb1FrameLowering::restoreCalleeSavedRegisters(
1138     MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1139     MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
1140   if (CSI.empty())
1141     return false;
1142 
1143   MachineFunction &MF = *MBB.getParent();
1144   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1145   const TargetInstrInfo &TII = *STI.getInstrInfo();
1146   const ARMBaseRegisterInfo *RegInfo = static_cast<const ARMBaseRegisterInfo *>(
1147       MF.getSubtarget().getRegisterInfo());
1148   bool IsVarArg = AFI->getArgRegsSaveSize() > 0;
1149   Register FPReg = RegInfo->getFrameRegister(MF);
1150 
1151   // In case FP is a high reg, we need a separate pop sequence to generate
1152   // a correct Frame Record
1153   bool NeedsFrameRecordPop = hasFP(MF) && ARM::hGPRRegClass.contains(FPReg);
1154 
1155   std::set<Register> FrameRecord;
1156   std::set<Register> SpilledGPRs;
1157   for (CalleeSavedInfo &I : CSI) {
1158     Register Reg = I.getReg();
1159     if (NeedsFrameRecordPop && (Reg == FPReg || Reg == ARM::LR))
1160       FrameRecord.insert(Reg);
1161     else
1162       SpilledGPRs.insert(Reg);
1163 
1164     if (Reg == ARM::LR)
1165       I.setRestored(false);
1166   }
1167 
1168   // Determine intermidiate registers which can be used for popping high regs:
1169   // - Spilled low regs
1170   // - Unused return registers
1171   std::set<Register> CopyRegs;
1172   std::set<Register> UnusedReturnRegs;
1173   for (Register Reg : SpilledGPRs)
1174     if ((ARM::tGPRRegClass.contains(Reg)) && !(hasFP(MF) && Reg == FPReg))
1175       CopyRegs.insert(Reg);
1176   auto Terminator = MBB.getFirstTerminator();
1177   if (Terminator != MBB.end() && Terminator->getOpcode() == ARM::tBX_RET) {
1178     UnusedReturnRegs.insert(ARM::R0);
1179     UnusedReturnRegs.insert(ARM::R1);
1180     UnusedReturnRegs.insert(ARM::R2);
1181     UnusedReturnRegs.insert(ARM::R3);
1182     for (auto Op : Terminator->implicit_operands()) {
1183       if (Op.isReg())
1184         UnusedReturnRegs.erase(Op.getReg());
1185     }
1186   }
1187   CopyRegs.insert(UnusedReturnRegs.begin(), UnusedReturnRegs.end());
1188 
1189   // First pop regular spilled regs.
1190   popRegsFromStack(MBB, MI, TII, SpilledGPRs, CopyRegs, IsVarArg,
1191                    STI.hasV5TOps());
1192 
1193   // LR may only be popped into pc, as part of a return sequence.
1194   // Check that no other pop instructions are inserted after that.
1195   assert((!SpilledGPRs.count(ARM::LR) || FrameRecord.empty()) &&
1196          "Can't insert pop after return sequence");
1197 
1198   // Now pop Frame Record regs.
1199   // Only unused return registers can be used as copy regs at this point.
1200   popRegsFromStack(MBB, MI, TII, FrameRecord, UnusedReturnRegs, IsVarArg,
1201                    STI.hasV5TOps());
1202 
1203   return true;
1204 }
1205