Go to the documentation of this file.
59 bool HasFP =
hasFP(MF);
99 (
MBBI->getOpcode() == AVR::PUSHRr ||
MBBI->getOpcode() == AVR::PUSHWRr)) {
110 MBBJ.addLiveIn(AVR::R29R28);
118 unsigned Opcode = (isUInt<6>(FrameSize)) ? AVR::SBIWRdK : AVR::SUBIWRdK;
125 MI->getOperand(3).setIsDead();
165 "Can only insert epilog into returning blocks");
182 int Opc = PI->getOpcode();
184 if (Opc != AVR::POPRd && Opc != AVR::POPWRd && !PI->isTerminator()) {
195 if (isUInt<6>(FrameSize)) {
196 Opcode = AVR::ADIWRdK;
198 Opcode = AVR::SUBIWRdK;
199 FrameSize = -FrameSize;
207 MI->getOperand(3).setIsDead();
241 unsigned CalleeFrameSize = 0;
250 bool IsNotLiveIn = !
MBB.isLiveIn(
Reg);
252 assert(
TRI->getRegSizeInBits(*
TRI->getMinimalPhysRegClass(
Reg)) == 8 &&
253 "Invalid register size");
289 assert(
TRI->getRegSizeInBits(*
TRI->getMinimalPhysRegClass(
Reg)) == 8 &&
290 "Invalid register size");
309 unsigned Opcode =
MI.getOpcode();
312 if (Opcode != AVR::STDSPQRr && Opcode != AVR::STDWSPQRr)
315 assert(
MI.getOperand(0).getReg() == AVR::SP &&
316 "SP is expected as base pointer");
321 (Opcode == AVR::STDWSPQRr) ? AVR::STDWPtrQRr : AVR::STDPtrQRr;
323 MI.setDesc(
TII.get(STOpc));
324 MI.getOperand(0).setReg(AVR::R31R30);
335 return MBB.erase(
MI);
339 unsigned int Opcode =
MI->getOpcode();
340 int Amount =
TII.getFrameSize(*
MI);
343 return MBB.erase(
MI);
348 if (Opcode ==
TII.getCallFrameSetupOpcode()) {
360 New->getOperand(3).setIsDead();
368 assert(Opcode ==
TII.getCallFrameDestroyOpcode());
377 if (isUInt<6>(Amount)) {
378 AddOpcode = AVR::ADIWRdK;
380 AddOpcode = AVR::SUBIWRdK;
390 New->getOperand(3).setIsDead();
396 return MBB.erase(
MI);
406 SavedRegs.
set(AVR::R29);
407 SavedRegs.
set(AVR::R28);
447 int Opcode =
MI.getOpcode();
449 if ((Opcode != AVR::LDDRdPtrQ) && (Opcode != AVR::LDDWRdPtrQ) &&
450 (Opcode != AVR::STDPtrQRr) && (Opcode != AVR::STDWPtrQRr)) {
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
This is an optimization pass for GlobalISel generic memory operations.
bool hasReservedCallFrame(const MachineFunction &MF) const override
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Information about stack frame layout on the target.
unsigned getNumFixedObjects() const
Return the number of fixed objects.
void setHasStackArgs(bool B)
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override
canSimplifyCallFramePseudos - When possible, it's best to simplify the call frame pseudo ops before d...
Reg
All possible values of the reg field in the ModR/M byte.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
auto reverse(ContainerTy &&C, std::enable_if_t< has_rbegin< ContainerTy >::value > *=nullptr)
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
static void fixStackStores(MachineBasicBlock &MBB, MachineBasicBlock::iterator StartMI, const TargetInstrInfo &TII)
Replace pseudo store instructions that pass arguments through the stack with real instructions.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
unsigned const TargetRegisterInfo * TRI
bool empty() const
empty - Check if the array is empty.
bool getHasStackArgs() const
void setCalleeSavedFrameSize(unsigned Bytes)
TargetInstrInfo - Interface to description of machine instruction set.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
A specific AVR target MCU.
@ Kill
The last use of a register.
const HexagonInstrInfo * TII
MachineOperand class - Representation of each machine instruction operand.
const AVRInstrInfo * getInstrInfo() const override
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
unsigned getCalleeSavedFrameSize() const
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
This struct is a compact representation of a valid (non-zero power of two) alignment.
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...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const MachineInstrBuilder & setMIFlag(MachineInstr::MIFlag Flag) const
Representation of each machine instruction.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
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...
bool isInterruptHandler() const
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
void setHasAllocas(bool B)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static void restoreStatusRegister(MachineFunction &MF, MachineBasicBlock &MBB)
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
StringRef - Represent a constant reference to a string, i.e.
MachineBasicBlock MachineBasicBlock::iterator MBBI
bool getHasSpills() const
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
int getIORegSREG(void) const
Wrapper class representing virtual and physical registers.
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
bool getHasAllocas() const
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
FunctionPass * createAVRFrameAnalyzerPass()
Creates instance of the frame analyzer pass.
@ Define
Register definition.
bool isInterruptOrSignalHandler() const
Checks if the function is some form of interrupt service routine.
unsigned getNumObjects() const
Return the number of objects.
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...
unsigned getKillRegState(bool B)
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
Utilities related to the AVR instruction set.
Contains AVR-specific information for each MachineFunction.
FunctionPass class - This class is used to implement most global optimizations.
Common register allocation spilling lr str ldr sxth r3 ldr mla r4 can lr mov lr str ldr sxth r3 mla r4 and then merge mul and lr str ldr sxth r3 mla r4 It also increase the likelihood the store may become dead bb27 Successors according to LLVM BB
virtual void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
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...
StringRef getPassName() const override
getPassName - Return a nice clean name for a pass.