LLVM 24.0.0git
AVRFrameLowering.cpp
Go to the documentation of this file.
1//===-- AVRFrameLowering.cpp - AVR 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 AVR implementation of TargetFrameLowering class.
10//
11//===----------------------------------------------------------------------===//
12
13#include "AVRFrameLowering.h"
14
15#include "AVR.h"
16#include "AVRInstrInfo.h"
18#include "AVRTargetMachine.h"
20
28
29namespace llvm {
30
33
35 const MachineFunction &MF) const {
36 // Always simplify call frame pseudo instructions, even when
37 // hasReservedCallFrame is false.
38 return true;
39}
40
42 // Reserve call frame memory in function prologue under the following
43 // conditions:
44 // - Y pointer is reserved to be the frame pointer.
45 // - The function does not contain variable sized objects.
46
47 const MachineFrameInfo &MFI = MF.getFrameInfo();
48 return hasFP(MF) && !MFI.hasVarSizedObjects();
49}
50
52 MachineBasicBlock &MBB) const {
54 DebugLoc DL = (MBBI != MBB.end()) ? MBBI->getDebugLoc() : DebugLoc();
55 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
56 const AVRInstrInfo &TII = *STI.getInstrInfo();
58 const MachineRegisterInfo &MRI = MF.getRegInfo();
59 bool HasFP = hasFP(MF);
60
61 // Interrupt handlers re-enable interrupts in function entry.
62 if (AFI->isInterruptHandler()) {
63 BuildMI(MBB, MBBI, DL, TII.get(AVR::BSETs))
64 .addImm(0x07)
66 }
67
68 // Emit special prologue code to save R1, R0 and SREG in interrupt/signal
69 // handlers before saving any other registers.
70 if (AFI->isInterruptOrSignalHandler()) {
71 BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHRr))
74
75 BuildMI(MBB, MBBI, DL, TII.get(AVR::INRdA), STI.getTmpRegister())
76 .addImm(STI.getIORegSREG())
78 BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHRr))
81 if (!MRI.reg_empty(STI.getZeroRegister())) {
82 BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHRr))
85 BuildMI(MBB, MBBI, DL, TII.get(AVR::EORRdRr))
90 }
91 }
92
93 // Early exit if the frame pointer is not needed in this function.
94 if (!HasFP) {
95 return;
96 }
97
98 const MachineFrameInfo &MFI = MF.getFrameInfo();
99 unsigned FrameSize = MFI.getStackSize() - AFI->getCalleeSavedFrameSize();
100
101 // Skip the callee-saved push instructions.
102 while (
103 (MBBI != MBB.end()) && MBBI->getFlag(MachineInstr::FrameSetup) &&
104 (MBBI->getOpcode() == AVR::PUSHRr || MBBI->getOpcode() == AVR::PUSHWRr)) {
105 ++MBBI;
106 }
107
108 // Update Y with the new base value.
109 BuildMI(MBB, MBBI, DL, TII.get(AVR::SPREAD), AVR::R29R28)
110 .addReg(AVR::SP)
112
113 // Mark the FramePtr as live-in in every block except the entry.
114 for (MachineBasicBlock &MBBJ : llvm::drop_begin(MF)) {
115 MBBJ.addLiveIn(AVR::R29R28);
116 }
117
118 if (!FrameSize) {
119 return;
120 }
121
122 // Reserve the necessary frame memory by doing FP -= <size>.
123 unsigned Opcode = (isUInt<6>(FrameSize) && STI.hasADDSUBIW()) ? AVR::SBIWRdK
124 : AVR::SUBIWRdK;
125
126 MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(Opcode), AVR::R29R28)
127 .addReg(AVR::R29R28, RegState::Kill)
128 .addImm(FrameSize)
130 // The SREG implicit def is dead.
131 MI->getOperand(3).setIsDead();
132
133 // Write back R29R28 to SP and temporarily disable interrupts.
134 BuildMI(MBB, MBBI, DL, TII.get(AVR::SPWRITE), AVR::SP)
135 .addReg(AVR::R29R28)
137}
138
141 const MachineRegisterInfo &MRI = MF.getRegInfo();
142
143 MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
144
145 DebugLoc DL = MBBI->getDebugLoc();
146 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
147 const AVRInstrInfo &TII = *STI.getInstrInfo();
148
149 // Emit special epilogue code to restore R1, R0 and SREG in interrupt/signal
150 // handlers at the very end of the function, just before reti.
151 if (AFI->isInterruptOrSignalHandler()) {
152 if (!MRI.reg_empty(STI.getZeroRegister())) {
153 BuildMI(MBB, MBBI, DL, TII.get(AVR::POPRd), STI.getZeroRegister());
154 }
155 BuildMI(MBB, MBBI, DL, TII.get(AVR::POPRd), STI.getTmpRegister());
156 BuildMI(MBB, MBBI, DL, TII.get(AVR::OUTARr))
157 .addImm(STI.getIORegSREG())
159 BuildMI(MBB, MBBI, DL, TII.get(AVR::POPRd), STI.getTmpRegister());
160 }
161}
162
164 MachineBasicBlock &MBB) const {
166
167 // Early exit if the frame pointer is not needed in this function except for
168 // signal/interrupt handlers where special code generation is required.
169 if (!hasFP(MF) && !AFI->isInterruptOrSignalHandler()) {
170 return;
171 }
172
173 MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
174 assert(MBBI->getDesc().isReturn() &&
175 "Can only insert epilog into returning blocks");
176
177 DebugLoc DL = MBBI->getDebugLoc();
178 const MachineFrameInfo &MFI = MF.getFrameInfo();
179 unsigned FrameSize = MFI.getStackSize() - AFI->getCalleeSavedFrameSize();
180 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
181 const AVRInstrInfo &TII = *STI.getInstrInfo();
182
183 // Early exit if there is no need to restore the frame pointer.
184 if (!FrameSize && !MF.getFrameInfo().hasVarSizedObjects()) {
186 return;
187 }
188
189 // Skip the callee-saved pop instructions.
190 while (MBBI != MBB.begin()) {
191 MachineBasicBlock::iterator PI = std::prev(MBBI);
192 int Opc = PI->getOpcode();
193
194 if (Opc != AVR::POPRd && Opc != AVR::POPWRd && !PI->isTerminator()) {
195 break;
196 }
197
198 --MBBI;
199 }
200
201 if (FrameSize) {
202 // Restore the frame pointer by doing FP += <size>.
203 BuildMI(MBB, MBBI, DL, TII.get(AVR::ADIWRdKP), AVR::R29R28)
204 .addReg(AVR::R29R28, RegState::Kill)
205 .addImm(FrameSize)
206 .setOperandDead(3); // implicit-def $sreg
207 }
208
209 // Write back R29R28 to SP and temporarily disable interrupts.
210 BuildMI(MBB, MBBI, DL, TII.get(AVR::SPWRITE), AVR::SP)
211 .addReg(AVR::R29R28, RegState::Kill);
212
214}
215
217 int FI,
218 Register &FrameReg) const {
219 int64_t Offset;
220 const MachineFrameInfo &MFI = MF.getFrameInfo();
221
222 switch (MFI.getStackID(FI)) {
224 Offset = MFI.getObjectOffset(FI) + MFI.getOffsetAdjustment() +
226
227 assert(Offset > 0);
228 break;
229
231 Offset = MFI.getObjectOffset(FI);
232 assert(Offset >= 0);
233 break;
234
235 default:
236 llvm_unreachable("Unsupported stack!");
237 }
238
240}
241
242// Return true if the specified function should have a dedicated frame
243// pointer register. This is true if the function meets any of the following
244// conditions:
245// - a register has been spilled
246// - has allocas
247// - input arguments are passed using the stack
248// - has variable sized objects
249// - the frame address is taken (llvm.frameaddress)
250// - the return address is taken (llvm.returnaddress)
251//
252// Notice that strictly this is not a frame pointer because it contains SP after
253// frame allocation instead of having the original SP in function entry.
255 const MachineFrameInfo &MFI = MF.getFrameInfo();
257
258 // Note that reading the return address requires a frame index, and that frame
259 // indexes are always referenced through Y (see
260 // AVRRegisterInfo::eliminateFrameIndex).
261 return (FuncInfo->getHasSpills() || FuncInfo->getHasAllocas() ||
262 FuncInfo->getHasStackArgs() || MFI.hasVarSizedObjects() ||
264}
265
269 if (CSI.empty()) {
270 return false;
271 }
272
273 unsigned CalleeFrameSize = 0;
274 DebugLoc DL = MBB.findDebugLoc(MI);
275 MachineFunction &MF = *MBB.getParent();
276 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
277 const TargetInstrInfo &TII = *STI.getInstrInfo();
279
280 for (const CalleeSavedInfo &I : llvm::reverse(CSI)) {
281 MCRegister Reg = I.getReg();
282 bool IsNotLiveIn = !MBB.isLiveIn(Reg);
283
284 // Check if Reg is a sub register of a 16-bit livein register, and then
285 // add it to the livein list.
286 if (IsNotLiveIn)
287 for (const auto &LiveIn : MBB.liveins())
288 if (STI.getRegisterInfo()->isSubRegister(LiveIn.PhysReg, Reg)) {
289 IsNotLiveIn = false;
290 MBB.addLiveIn(Reg);
291 break;
292 }
293
294 assert(TRI->getRegSizeInBits(*TRI->getMinimalPhysRegClass(Reg)) == 8 &&
295 "Invalid register size");
296
297 // Add the callee-saved register as live-in only if it is not already a
298 // live-in register, this usually happens with arguments that are passed
299 // through callee-saved registers.
300 if (IsNotLiveIn) {
301 MBB.addLiveIn(Reg);
302 }
303
304 // Do not kill the register when it is an input argument.
305 BuildMI(MBB, MI, DL, TII.get(AVR::PUSHRr))
306 .addReg(Reg, getKillRegState(IsNotLiveIn))
308 ++CalleeFrameSize;
309 }
310
311 AVRFI->setCalleeSavedFrameSize(CalleeFrameSize);
312
313 return true;
314}
315
319 if (CSI.empty()) {
320 return false;
321 }
322
323 DebugLoc DL = MBB.findDebugLoc(MI);
324 const MachineFunction &MF = *MBB.getParent();
325 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
326 const TargetInstrInfo &TII = *STI.getInstrInfo();
327
328 for (const CalleeSavedInfo &CCSI : CSI) {
329 MCRegister Reg = CCSI.getReg();
330
331 assert(TRI->getRegSizeInBits(*TRI->getMinimalPhysRegClass(Reg)) == 8 &&
332 "Invalid register size");
333
334 BuildMI(MBB, MI, DL, TII.get(AVR::POPRd), Reg);
335 }
336
337 return true;
338}
339
340/// Replace pseudo store instructions that pass arguments through the stack with
341/// real instructions.
344 const TargetInstrInfo &TII) {
345 // Iterate through the BB until we hit a call instruction or we reach the end.
346 for (MachineInstr &MI :
348 if (MI.isCall())
349 break;
350
351 unsigned Opcode = MI.getOpcode();
352
353 // Only care of pseudo store instructions where SP is the base pointer.
354 if (Opcode != AVR::STDSPQRr && Opcode != AVR::STDWSPQRr)
355 continue;
356
357 assert(MI.getOperand(0).getReg() == AVR::SP &&
358 "SP is expected as base pointer");
359
360 // Replace this instruction with a regular store. Use Y as the base
361 // pointer since it is guaranteed to contain a copy of SP.
362 unsigned STOpc =
363 (Opcode == AVR::STDWSPQRr) ? AVR::STDWPtrQRr : AVR::STDPtrQRr;
364
365 MI.setDesc(TII.get(STOpc));
366 MI.getOperand(0).setReg(AVR::R31R30);
367 }
368}
369
373 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
374 const AVRInstrInfo &TII = *STI.getInstrInfo();
375
376 if (hasReservedCallFrame(MF)) {
377 return MBB.erase(MI);
378 }
379
380 DebugLoc DL = MI->getDebugLoc();
381 unsigned int Opcode = MI->getOpcode();
382 int Amount = TII.getFrameSize(*MI);
383
384 if (Amount == 0) {
385 return MBB.erase(MI);
386 }
387
388 assert(getStackAlign() == Align(1) && "Unsupported stack alignment");
389
390 if (Opcode == TII.getCallFrameSetupOpcode()) {
391 // Update the stack pointer.
392 // In many cases this can be done far more efficiently by pushing the
393 // relevant values directly to the stack. However, doing that correctly
394 // (in the right order, possibly skipping some empty space for undef
395 // values, etc) is tricky and thus left to be optimized in the future.
396 BuildMI(MBB, MI, DL, TII.get(AVR::SPREAD), AVR::R31R30).addReg(AVR::SP);
397
398 MachineInstr *New =
399 BuildMI(MBB, MI, DL, TII.get(AVR::SUBIWRdK), AVR::R31R30)
400 .addReg(AVR::R31R30, RegState::Kill)
401 .addImm(Amount);
402 New->getOperand(3).setIsDead();
403
404 BuildMI(MBB, MI, DL, TII.get(AVR::SPWRITE), AVR::SP).addReg(AVR::R31R30);
405
406 // Make sure the remaining stack stores are converted to real store
407 // instructions.
409 } else {
410 assert(Opcode == TII.getCallFrameDestroyOpcode());
411
412 // Note that small stack changes could be implemented more efficiently
413 // with a few pop instructions instead of the 8-9 instructions now
414 // required.
415
416 BuildMI(MBB, MI, DL, TII.get(AVR::SPREAD), AVR::R31R30).addReg(AVR::SP);
417
418 BuildMI(MBB, MI, DL, TII.get(AVR::ADIWRdKP), AVR::R31R30)
419 .addReg(AVR::R31R30, RegState::Kill)
420 .addImm(Amount)
421 .setOperandDead(3); // implicit-def $sreg
422
423 BuildMI(MBB, MI, DL, TII.get(AVR::SPWRITE), AVR::SP)
424 .addReg(AVR::R31R30, RegState::Kill);
425 }
426
427 return MBB.erase(MI);
428}
429
431 BitVector &SavedRegs,
432 RegScavenger *RS) const {
434
435 // If we have a frame pointer, the Y register needs to be saved as well.
436 if (hasFP(MF)) {
437 SavedRegs.set(AVR::R29);
438 SavedRegs.set(AVR::R28);
439 }
440}
441
442/// The frame analyzer pass.
443///
444/// Scans the function for allocas and used arguments
445/// that are passed through the stack.
447 static char ID;
449
451 const MachineFrameInfo &MFI = MF.getFrameInfo();
453
454 // If there are no fixed frame indexes during this stage it means there
455 // are allocas present in the function.
456 if (MFI.getNumObjects() != MFI.getNumFixedObjects()) {
457 // Check for the type of allocas present in the function. We only care
458 // about fixed size allocas so do not give false positives if only
459 // variable sized allocas are present.
460 for (unsigned i = 0, e = MFI.getObjectIndexEnd(); i != e; ++i) {
461 if (!MFI.isVariableSizedObjectIndex(i) && !MFI.isDeadObjectIndex(i)) {
462 AFI->setHasAllocas(true);
463 break;
464 }
465 }
466 }
467
468 // If there are fixed frame indexes present, scan the function to see if
469 // they are really being used.
470 if (MFI.getNumFixedObjects() == 0) {
471 return false;
472 }
473
474 // Ok fixed frame indexes present, now scan the function to see if they
475 // are really being used, otherwise we can ignore them.
476 for (const MachineBasicBlock &BB : MF) {
477 for (const MachineInstr &MI : BB) {
478 int Opcode = MI.getOpcode();
479
480 if ((Opcode != AVR::LDDRdPtrQ) && (Opcode != AVR::LDDWRdPtrQ) &&
481 (Opcode != AVR::STDPtrQRr) && (Opcode != AVR::STDWPtrQRr) &&
482 (Opcode != AVR::FRMIDX)) {
483 continue;
484 }
485
486 for (const MachineOperand &MO : MI.operands()) {
487 if (!MO.isFI()) {
488 continue;
489 }
490
491 if (MFI.isFixedObjectIndex(MO.getIndex())) {
492 AFI->setHasStackArgs(true);
493 return false;
494 }
495 }
496 }
497 }
498
499 return false;
500 }
501
502 StringRef getPassName() const override { return "AVR Frame Analyzer"; }
503};
504
505char AVRFrameAnalyzer::ID = 0;
506
507/// Creates instance of the frame analyzer pass.
509
510} // end of namespace llvm
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const override
This method is called during prolog/epilog code insertion to eliminate call frame setup and destroy p...
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
bool hasReservedCallFrame(const MachineFunction &MF) const override
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, MutableArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee saved registers and returns...
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override
canSimplifyCallFramePseudos - When possible, it's best to simplify the call frame pseudo ops before d...
StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const override
getFrameIndexReference - This method should return the base register and offset used to reference a f...
bool hasFPImpl(const MachineFunction &MF) const override
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, ArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
spillCalleeSavedRegisters - Issues instruction(s) to spill all callee saved registers and returns tru...
Utilities related to the AVR instruction set.
Contains AVR-specific information for each MachineFunction.
void setCalleeSavedFrameSize(unsigned Bytes)
bool isInterruptOrSignalHandler() const
Checks if the function is some form of interrupt service routine.
A specific AVR target MCU.
Register getTmpRegister() const
Register getZeroRegister() const
const AVRInstrInfo * getInstrInfo() const override
int getIORegSREG() const
const AVRRegisterInfo * getRegisterInfo() const override
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
A debug info location.
Definition DebugLoc.h:126
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
bool isReturnAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
int64_t getOffsetAdjustment() const
Return the correction for frame offsets.
unsigned getNumObjects() const
Return the number of objects.
bool isVariableSizedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a variable sized object.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
uint8_t getStackID(int ObjectIdx) const
unsigned getNumFixedObjects() const
Return the number of fixed objects.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineInstrBuilder & setOperandDead(unsigned OpIdx) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & setMIFlag(MachineInstr::MIFlag Flag) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Wrapper class representing virtual and physical registers.
Definition Register.h:20
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:30
int64_t getFixed() const
Returns the fixed component of the stack.
Definition TypeSize.h:46
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
virtual void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
int getOffsetOfLocalArea() const
getOffsetOfLocalArea - This method returns the offset of the local area from the stack pointer on ent...
TargetFrameLowering(StackDirection D, Align StackAl, int LAO, Align TransAl=Align(1), bool StackReal=true)
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
@ Offset
Definition DWP.cpp:577
static void fixStackStores(MachineBasicBlock &MBB, MachineBasicBlock::iterator StartMI, const TargetInstrInfo &TII)
Replace pseudo store instructions that pass arguments through the stack with real instructions.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Kill
The last use of a register.
@ Define
Register definition.
constexpr RegState getKillRegState(bool B)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
FunctionPass * createAVRFrameAnalyzerPass()
Creates instance of the frame analyzer pass.
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:190
static void restoreStatusRegister(MachineFunction &MF, MachineBasicBlock &MBB)
The frame analyzer pass.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
StringRef getPassName() const override
getPassName - Return a nice clean name for a pass.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39