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
30#include "llvm/IR/Analysis.h"
31#include "llvm/Pass.h"
33
34using namespace llvm;
35
36namespace llvm {
37
40
42 const MachineFunction &MF) const {
43 // Always simplify call frame pseudo instructions, even when
44 // hasReservedCallFrame is false.
45 return true;
46}
47
49 // Reserve call frame memory in function prologue under the following
50 // conditions:
51 // - Y pointer is reserved to be the frame pointer.
52 // - The function does not contain variable sized objects.
53
54 const MachineFrameInfo &MFI = MF.getFrameInfo();
55 return hasFP(MF) && !MFI.hasVarSizedObjects();
56}
57
59 MachineBasicBlock &MBB) const {
61 DebugLoc DL = (MBBI != MBB.end()) ? MBBI->getDebugLoc() : DebugLoc();
62 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
63 const AVRInstrInfo &TII = *STI.getInstrInfo();
66 bool HasFP = hasFP(MF);
67
68 // Interrupt handlers re-enable interrupts in function entry.
69 if (AFI->isInterruptHandler()) {
70 BuildMI(MBB, MBBI, DL, TII.get(AVR::BSETs))
71 .addImm(0x07)
73 }
74
75 // Emit special prologue code to save R1, R0 and SREG in interrupt/signal
76 // handlers before saving any other registers.
77 if (AFI->isInterruptOrSignalHandler()) {
78 BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHRr))
81
82 BuildMI(MBB, MBBI, DL, TII.get(AVR::INRdA), STI.getTmpRegister())
83 .addImm(STI.getIORegSREG())
85 BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHRr))
88 if (!MRI.reg_empty(STI.getZeroRegister())) {
89 BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHRr))
92 BuildMI(MBB, MBBI, DL, TII.get(AVR::EORRdRr))
97 }
98 }
99
100 // Early exit if the frame pointer is not needed in this function.
101 if (!HasFP) {
102 return;
103 }
104
105 const MachineFrameInfo &MFI = MF.getFrameInfo();
106 unsigned FrameSize = MFI.getStackSize() - AFI->getCalleeSavedFrameSize();
107
108 // Skip the callee-saved push instructions.
109 while (
110 (MBBI != MBB.end()) && MBBI->getFlag(MachineInstr::FrameSetup) &&
111 (MBBI->getOpcode() == AVR::PUSHRr || MBBI->getOpcode() == AVR::PUSHWRr)) {
112 ++MBBI;
113 }
114
115 // Update Y with the new base value.
116 BuildMI(MBB, MBBI, DL, TII.get(AVR::SPREAD), AVR::R29R28)
117 .addReg(AVR::SP)
119
120 // Mark the FramePtr as live-in in every block except the entry.
121 for (MachineBasicBlock &MBBJ : llvm::drop_begin(MF)) {
122 MBBJ.addLiveIn(AVR::R29R28);
123 }
124
125 if (!FrameSize) {
126 return;
127 }
128
129 // Reserve the necessary frame memory by doing FP -= <size>.
130 unsigned Opcode = (isUInt<6>(FrameSize) && STI.hasADDSUBIW()) ? AVR::SBIWRdK
131 : AVR::SUBIWRdK;
132
133 MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(Opcode), AVR::R29R28)
134 .addReg(AVR::R29R28, RegState::Kill)
135 .addImm(FrameSize)
137 // The SREG implicit def is dead.
138 MI->getOperand(3).setIsDead();
139
140 // Write back R29R28 to SP and temporarily disable interrupts.
141 BuildMI(MBB, MBBI, DL, TII.get(AVR::SPWRITE), AVR::SP)
142 .addReg(AVR::R29R28)
144}
145
148 const MachineRegisterInfo &MRI = MF.getRegInfo();
149
150 MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
151
152 DebugLoc DL = MBBI->getDebugLoc();
153 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
154 const AVRInstrInfo &TII = *STI.getInstrInfo();
155
156 // Emit special epilogue code to restore R1, R0 and SREG in interrupt/signal
157 // handlers at the very end of the function, just before reti.
158 if (AFI->isInterruptOrSignalHandler()) {
159 if (!MRI.reg_empty(STI.getZeroRegister())) {
160 BuildMI(MBB, MBBI, DL, TII.get(AVR::POPRd), STI.getZeroRegister());
161 }
162 BuildMI(MBB, MBBI, DL, TII.get(AVR::POPRd), STI.getTmpRegister());
163 BuildMI(MBB, MBBI, DL, TII.get(AVR::OUTARr))
164 .addImm(STI.getIORegSREG())
166 BuildMI(MBB, MBBI, DL, TII.get(AVR::POPRd), STI.getTmpRegister());
167 }
168}
169
171 MachineBasicBlock &MBB) const {
173
174 // Early exit if the frame pointer is not needed in this function except for
175 // signal/interrupt handlers where special code generation is required.
176 if (!hasFP(MF) && !AFI->isInterruptOrSignalHandler()) {
177 return;
178 }
179
180 MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
181 assert(MBBI->getDesc().isReturn() &&
182 "Can only insert epilog into returning blocks");
183
184 DebugLoc DL = MBBI->getDebugLoc();
185 const MachineFrameInfo &MFI = MF.getFrameInfo();
186 unsigned FrameSize = MFI.getStackSize() - AFI->getCalleeSavedFrameSize();
187 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
188 const AVRInstrInfo &TII = *STI.getInstrInfo();
189
190 // Early exit if there is no need to restore the frame pointer.
191 if (!FrameSize && !MF.getFrameInfo().hasVarSizedObjects()) {
193 return;
194 }
195
196 // Skip the callee-saved pop instructions.
197 while (MBBI != MBB.begin()) {
198 MachineBasicBlock::iterator PI = std::prev(MBBI);
199 int Opc = PI->getOpcode();
200
201 if (Opc != AVR::POPRd && Opc != AVR::POPWRd && !PI->isTerminator()) {
202 break;
203 }
204
205 --MBBI;
206 }
207
208 if (FrameSize) {
209 // Restore the frame pointer by doing FP += <size>.
210 BuildMI(MBB, MBBI, DL, TII.get(AVR::ADIWRdKP), AVR::R29R28)
211 .addReg(AVR::R29R28, RegState::Kill)
212 .addImm(FrameSize)
213 .setOperandDead(3); // implicit-def $sreg
214 }
215
216 // Write back R29R28 to SP and temporarily disable interrupts.
217 BuildMI(MBB, MBBI, DL, TII.get(AVR::SPWRITE), AVR::SP)
218 .addReg(AVR::R29R28, RegState::Kill);
219
221}
222
224 int FI,
225 Register &FrameReg) const {
226 int64_t Offset;
227 const MachineFrameInfo &MFI = MF.getFrameInfo();
228
229 switch (MFI.getStackID(FI)) {
231 Offset = MFI.getObjectOffset(FI) + MFI.getOffsetAdjustment() +
233
234 assert(Offset > 0);
235 break;
236
238 Offset = MFI.getObjectOffset(FI);
239 assert(Offset >= 0);
240 break;
241
242 default:
243 llvm_unreachable("Unsupported stack!");
244 }
245
246 // Frame indices are addressed relative to the frame register (see
247 // AVRRegisterInfo::eliminateFrameIndex); callers such as the DWARF
248 // debug info emitter rely on it being reported back here.
249 FrameReg = MF.getSubtarget().getRegisterInfo()->getFrameRegister(MF);
250
252}
253
254// Return true if the specified function should have a dedicated frame
255// pointer register. This is true if the function meets any of the following
256// conditions:
257// - a register has been spilled
258// - has allocas
259// - input arguments are passed using the stack
260// - has variable sized objects
261// - the frame address is taken (llvm.frameaddress)
262// - the return address is taken (llvm.returnaddress)
263//
264// Notice that strictly this is not a frame pointer because it contains SP after
265// frame allocation instead of having the original SP in function entry.
267 const MachineFrameInfo &MFI = MF.getFrameInfo();
269
270 // Note that reading the return address requires a frame index, and that frame
271 // indexes are always referenced through Y (see
272 // AVRRegisterInfo::eliminateFrameIndex).
273 return (FuncInfo->getHasSpills() || FuncInfo->getHasAllocas() ||
274 FuncInfo->getHasStackArgs() || MFI.hasVarSizedObjects() ||
276}
277
281 if (CSI.empty()) {
282 return false;
283 }
284
285 unsigned CalleeFrameSize = 0;
286 DebugLoc DL = MBB.findDebugLoc(MI);
287 MachineFunction &MF = *MBB.getParent();
288 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
289 const TargetInstrInfo &TII = *STI.getInstrInfo();
291
292 for (const CalleeSavedInfo &I : llvm::reverse(CSI)) {
293 MCRegister Reg = I.getReg();
294 bool IsNotLiveIn = !MBB.isLiveIn(Reg);
295
296 // Check if Reg is a sub register of a 16-bit livein register, and then
297 // add it to the livein list.
298 if (IsNotLiveIn)
299 for (const auto &LiveIn : MBB.liveins())
300 if (STI.getRegisterInfo()->isSubRegister(LiveIn.PhysReg, Reg)) {
301 IsNotLiveIn = false;
302 MBB.addLiveIn(Reg);
303 break;
304 }
305
306 assert(TRI->getRegSizeInBits(*TRI->getMinimalPhysRegClass(Reg)) == 8 &&
307 "Invalid register size");
308
309 // Add the callee-saved register as live-in only if it is not already a
310 // live-in register, this usually happens with arguments that are passed
311 // through callee-saved registers.
312 if (IsNotLiveIn) {
313 MBB.addLiveIn(Reg);
314 }
315
316 // Do not kill the register when it is an input argument.
317 BuildMI(MBB, MI, DL, TII.get(AVR::PUSHRr))
318 .addReg(Reg, getKillRegState(IsNotLiveIn))
320 ++CalleeFrameSize;
321 }
322
323 AVRFI->setCalleeSavedFrameSize(CalleeFrameSize);
324
325 return true;
326}
327
331 if (CSI.empty()) {
332 return false;
333 }
334
335 DebugLoc DL = MBB.findDebugLoc(MI);
336 const MachineFunction &MF = *MBB.getParent();
337 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
338 const TargetInstrInfo &TII = *STI.getInstrInfo();
339
340 for (const CalleeSavedInfo &CCSI : CSI) {
341 MCRegister Reg = CCSI.getReg();
342
343 assert(TRI->getRegSizeInBits(*TRI->getMinimalPhysRegClass(Reg)) == 8 &&
344 "Invalid register size");
345
346 BuildMI(MBB, MI, DL, TII.get(AVR::POPRd), Reg);
347 }
348
349 return true;
350}
351
352/// Replace pseudo store instructions that pass arguments through the stack with
353/// real instructions.
356 const TargetInstrInfo &TII) {
357 // Iterate through the BB until we hit a call instruction or we reach the end.
358 for (MachineInstr &MI :
360 if (MI.isCall())
361 break;
362
363 unsigned Opcode = MI.getOpcode();
364
365 // Only care of pseudo store instructions where SP is the base pointer.
366 if (Opcode != AVR::STDSPQRr && Opcode != AVR::STDWSPQRr)
367 continue;
368
369 assert(MI.getOperand(0).getReg() == AVR::SP &&
370 "SP is expected as base pointer");
371
372 // Replace this instruction with a regular store. Use Y as the base
373 // pointer since it is guaranteed to contain a copy of SP.
374 unsigned STOpc =
375 (Opcode == AVR::STDWSPQRr) ? AVR::STDWPtrQRr : AVR::STDPtrQRr;
376
377 MI.setDesc(TII.get(STOpc));
378 MI.getOperand(0).setReg(AVR::R31R30);
379 }
380}
381
385 const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
386 const AVRInstrInfo &TII = *STI.getInstrInfo();
387
388 if (hasReservedCallFrame(MF)) {
389 return MBB.erase(MI);
390 }
391
392 DebugLoc DL = MI->getDebugLoc();
393 unsigned int Opcode = MI->getOpcode();
394 int Amount = TII.getFrameSize(*MI);
395
396 if (Amount == 0) {
397 return MBB.erase(MI);
398 }
399
400 assert(getStackAlign() == Align(1) && "Unsupported stack alignment");
401
402 if (Opcode == TII.getCallFrameSetupOpcode()) {
403 // Update the stack pointer.
404 // In many cases this can be done far more efficiently by pushing the
405 // relevant values directly to the stack. However, doing that correctly
406 // (in the right order, possibly skipping some empty space for undef
407 // values, etc) is tricky and thus left to be optimized in the future.
408 BuildMI(MBB, MI, DL, TII.get(AVR::SPREAD), AVR::R31R30).addReg(AVR::SP);
409
410 MachineInstr *New =
411 BuildMI(MBB, MI, DL, TII.get(AVR::SUBIWRdK), AVR::R31R30)
412 .addReg(AVR::R31R30, RegState::Kill)
413 .addImm(Amount);
414 New->getOperand(3).setIsDead();
415
416 BuildMI(MBB, MI, DL, TII.get(AVR::SPWRITE), AVR::SP).addReg(AVR::R31R30);
417
418 // Make sure the remaining stack stores are converted to real store
419 // instructions.
421 } else {
422 assert(Opcode == TII.getCallFrameDestroyOpcode());
423
424 // Note that small stack changes could be implemented more efficiently
425 // with a few pop instructions instead of the 8-9 instructions now
426 // required.
427
428 BuildMI(MBB, MI, DL, TII.get(AVR::SPREAD), AVR::R31R30).addReg(AVR::SP);
429
430 BuildMI(MBB, MI, DL, TII.get(AVR::ADIWRdKP), AVR::R31R30)
431 .addReg(AVR::R31R30, RegState::Kill)
432 .addImm(Amount)
433 .setOperandDead(3); // implicit-def $sreg
434
435 BuildMI(MBB, MI, DL, TII.get(AVR::SPWRITE), AVR::SP)
436 .addReg(AVR::R31R30, RegState::Kill);
437 }
438
439 return MBB.erase(MI);
440}
441
443 BitVector &SavedRegs,
444 RegScavenger *RS) const {
446
447 // If we have a frame pointer, the Y register needs to be saved as well.
448 if (hasFP(MF)) {
449 SavedRegs.set(AVR::R29);
450 SavedRegs.set(AVR::R28);
451 }
452}
453
454} // end of namespace llvm
455
456namespace {
457/// The frame analyzer pass.
458///
459/// Scans the function for allocas and used arguments
460/// that are passed through the stack.
461struct AVRFrameAnalyzerLegacy : public MachineFunctionPass {
462 static char ID;
463 AVRFrameAnalyzerLegacy() : MachineFunctionPass(ID) {}
464
465 bool runOnMachineFunction(MachineFunction &MF) override;
466
467 StringRef getPassName() const override { return "AVR Frame Analyzer"; }
468
469 void getAnalysisUsage(AnalysisUsage &AU) const override {
470 AU.setPreservesAll();
472 }
473};
474
475} // namespace
476
477char AVRFrameAnalyzerLegacy::ID = 0;
478
479/// Creates instance of the frame analyzer pass.
481 return new AVRFrameAnalyzerLegacy();
482}
483
485 const MachineFrameInfo &MFI = MF.getFrameInfo();
487
488 // If there are no fixed frame indexes during this stage it means there
489 // are allocas present in the function.
490 if (MFI.getNumObjects() != MFI.getNumFixedObjects()) {
491 // Check for the type of allocas present in the function. We only care
492 // about fixed size allocas so do not give false positives if only
493 // variable sized allocas are present.
494 for (unsigned i = 0, e = MFI.getObjectIndexEnd(); i != e; ++i) {
495 if (!MFI.isVariableSizedObjectIndex(i) && !MFI.isDeadObjectIndex(i)) {
496 AFI->setHasAllocas(true);
497 break;
498 }
499 }
500 }
501
502 // If there are fixed frame indexes present, scan the function to see if
503 // they are really being used.
504 if (MFI.getNumFixedObjects() == 0) {
505 return false;
506 }
507
508 // Ok fixed frame indexes present, now scan the function to see if they
509 // are really being used, otherwise we can ignore them.
510 for (const MachineBasicBlock &BB : MF) {
511 for (const MachineInstr &MI : BB) {
512 int Opcode = MI.getOpcode();
513
514 if ((Opcode != AVR::LDDRdPtrQ) && (Opcode != AVR::LDDWRdPtrQ) &&
515 (Opcode != AVR::STDPtrQRr) && (Opcode != AVR::STDWPtrQRr) &&
516 (Opcode != AVR::FRMIDX)) {
517 continue;
518 }
519
520 for (const MachineOperand &MO : MI.operands()) {
521 if (!MO.isFI()) {
522 continue;
523 }
524
525 if (MFI.isFixedObjectIndex(MO.getIndex())) {
526 AFI->setHasStackArgs(true);
527 return false;
528 }
529 }
530 }
531 }
532
533 return false;
534}
535
536bool AVRFrameAnalyzerLegacy::runOnMachineFunction(MachineFunction &MF) {
537 return runFrameAnalyzer(MF);
538}
539
540PreservedAnalyses
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static bool runFrameAnalyzer(MachineFunction &MF)
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
MachineRegisterInfo & MRI
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
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
void setPreservesAll()
Set by analyses that do not transform their input at all.
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:312
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.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
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
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Wrapper class representing virtual and physical registers.
Definition Register.h:20
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:31
int64_t getFixed() const
Returns the fixed component of the stack.
Definition TypeSize.h:47
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...
virtual Register getFrameRegister(const MachineFunction &MF) const =0
Debug information queries.
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Pass manager infrastructure for declaring and invalidating analyses.
#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
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
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)
FunctionPass * createAVRFrameAnalyzerLegacyPass()
Creates instance of the frame analyzer pass.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39