58 bool HasFP =
hasFP(MF);
103 (
MBBI->getOpcode() == AVR::PUSHRr ||
MBBI->getOpcode() == AVR::PUSHWRr)) {
114 MBBJ.addLiveIn(AVR::R29R28);
122 unsigned Opcode = (isUInt<6>(FrameSize) && STI.hasADDSUBIW()) ? AVR::SBIWRdK
130 MI->getOperand(3).setIsDead();
174 "Can only insert epilog into returning blocks");
191 int Opc = PI->getOpcode();
193 if (Opc != AVR::POPRd && Opc != AVR::POPWRd && !PI->isTerminator()) {
204 if (isUInt<6>(FrameSize) && STI.hasADDSUBIW()) {
205 Opcode = AVR::ADIWRdK;
207 Opcode = AVR::SUBIWRdK;
208 FrameSize = -FrameSize;
216 MI->getOperand(3).setIsDead();
250 unsigned CalleeFrameSize = 0;
259 bool IsNotLiveIn = !
MBB.isLiveIn(
Reg);
264 for (
const auto &LiveIn :
MBB.liveins())
271 assert(
TRI->getRegSizeInBits(*
TRI->getMinimalPhysRegClass(
Reg)) == 8 &&
272 "Invalid register size");
308 assert(
TRI->getRegSizeInBits(*
TRI->getMinimalPhysRegClass(
Reg)) == 8 &&
309 "Invalid register size");
328 unsigned Opcode =
MI.getOpcode();
331 if (Opcode != AVR::STDSPQRr && Opcode != AVR::STDWSPQRr)
334 assert(
MI.getOperand(0).getReg() == AVR::SP &&
335 "SP is expected as base pointer");
340 (Opcode == AVR::STDWSPQRr) ? AVR::STDWPtrQRr : AVR::STDPtrQRr;
342 MI.setDesc(
TII.get(STOpc));
343 MI.getOperand(0).setReg(AVR::R31R30);
354 return MBB.erase(
MI);
358 unsigned int Opcode =
MI->getOpcode();
359 int Amount =
TII.getFrameSize(*
MI);
362 return MBB.erase(
MI);
367 if (Opcode ==
TII.getCallFrameSetupOpcode()) {
379 New->getOperand(3).setIsDead();
387 assert(Opcode ==
TII.getCallFrameDestroyOpcode());
396 if (isUInt<6>(Amount) && STI.hasADDSUBIW()) {
397 AddOpcode = AVR::ADIWRdK;
399 AddOpcode = AVR::SUBIWRdK;
409 New->getOperand(3).setIsDead();
415 return MBB.erase(
MI);
425 SavedRegs.
set(AVR::R29);
426 SavedRegs.
set(AVR::R28);
466 int Opcode =
MI.getOpcode();
468 if ((Opcode != AVR::LDDRdPtrQ) && (Opcode != AVR::LDDWRdPtrQ) &&
469 (Opcode != AVR::STDPtrQRr) && (Opcode != AVR::STDWPtrQRr) &&
470 (Opcode != AVR::FRMIDX)) {
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
const HexagonInstrInfo * TII
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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 hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
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...
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.
bool isInterruptHandler() const
bool getHasSpills() const
void setCalleeSavedFrameSize(unsigned Bytes)
unsigned getCalleeSavedFrameSize() const
bool getHasStackArgs() const
bool getHasAllocas() const
void setHasStackArgs(bool B)
void setHasAllocas(bool B)
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
const AVRRegisterInfo * getRegisterInfo() const override
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
empty - Check if the array is empty.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
FunctionPass class - This class is used to implement most global optimizations.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
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.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
unsigned getNumObjects() const
Return the number of objects.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
unsigned getNumFixedObjects() const
Return the number of fixed objects.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
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 & setMIFlag(MachineInstr::MIFlag Flag) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Wrapper class representing virtual and physical registers.
StringRef - Represent a constant reference to a string, i.e.
Information about stack frame layout on the target.
virtual void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
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
Register definition.
@ Kill
The last use of a register.
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.
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.
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...
FunctionPass * createAVRFrameAnalyzerPass()
Creates instance of the frame analyzer pass.
auto reverse(ContainerTy &&C)
unsigned getKillRegState(bool B)
static void restoreStatusRegister(MachineFunction &MF, MachineBasicBlock &MBB)
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.