32 cl::desc(
"Disable Sparc leaf procedure optimization."),
45 unsigned ADDri)
const {
51 if (NumBytes >= -4096 && NumBytes < 4096) {
89 assert(&MF.
front() == &
MBB &&
"Shrink-wrapping not yet supported");
100 bool NeedsStackRealignment = RegInfo.shouldRealignStack(MF);
104 "stack re-alignment, but LLVM couldn't handle it "
105 "(probably because it has a dynamic alloca).");
110 unsigned SAVEri = SP::SAVEri;
111 unsigned SAVErr = SP::SAVErr;
149 emitSPAdjustment(MF,
MBB,
MBBI, -NumBytes, SAVErr, SAVEri);
151 unsigned regFP = RegInfo.getDwarfRegNum(SP::I6,
true);
164 unsigned regInRA = RegInfo.getDwarfRegNum(SP::I7,
true);
165 unsigned regOutRA = RegInfo.getDwarfRegNum(SP::O7,
true);
172 if (NeedsStackRealignment) {
174 unsigned regUnbiased;
177 regUnbiased = SP::G1;
182 regUnbiased = SP::O6;
203 int Size =
MI.getOperand(0).getImm();
204 if (
MI.getOpcode() == SP::ADJCALLSTACKDOWN)
208 emitSPAdjustment(MF,
MBB,
I,
Size, SP::ADDrr, SP::ADDri);
221 assert((
MBBI->getOpcode() == SP::RETL ||
MBBI->getOpcode() == SP::TAIL_CALL ||
222 MBBI->getOpcode() == SP::TAIL_CALLri) &&
223 "Can only put epilog before 'retl' or 'tail_call' instruction!");
233 emitSPAdjustment(MF,
MBB,
MBBI, NumBytes, SP::ADDrr, SP::ADDri);
236 if (
MBBI->getOpcode() == SP::TAIL_CALL) {
271 bool isFixed = MFI.isFixedObjectIndex(FI);
284 }
else if (isFixed) {
287 }
else if (RegInfo->hasStackRealignment(MF)) {
312 for (
unsigned reg = SP::I0; reg <= SP::I7; ++reg)
313 if (
MRI->isPhysRegUsed(reg))
316 for (
unsigned reg = SP::L0; reg <= SP::L7; ++reg)
317 if (
MRI->isPhysRegUsed(reg))
330 ||
MRI.isPhysRegUsed(SP::L0)
331 ||
MRI.isPhysRegUsed(SP::O6)
336void SparcFrameLowering::remapRegsForLeafProc(
MachineFunction &MF)
const {
339 for (
unsigned reg = SP::I0; reg <= SP::I7; ++reg) {
340 if (!
MRI.isPhysRegUsed(reg))
343 unsigned mapped_reg = reg - SP::I0 + SP::O0;
346 MRI.replaceRegWith(reg, mapped_reg);
349 if ((reg - SP::I0) % 2 == 0) {
350 unsigned preg = (reg - SP::I0) / 2 + SP::I0_I1;
351 unsigned mapped_preg = preg - SP::I0_I1 + SP::O0_O1;
352 MRI.replaceRegWith(preg, mapped_preg);
358 for (
unsigned reg = SP::I0_I1; reg <= SP::I6_I7; ++reg) {
364 for (
unsigned reg = SP::I0; reg <= SP::I7; ++reg) {
373#ifdef EXPENSIVE_CHECKS
374 MF.verify(0,
"After LeafProc Remapping");
386 remapRegsForLeafProc(MF);
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock MachineBasicBlock::iterator MBBI
#define LLVM_ATTRIBUTE_UNUSED
const HexagonInstrInfo * TII
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static cl::opt< bool > DisableLeafProc("disable-sparc-leaf-proc", cl::init(false), cl::desc("Disable Sparc leaf procedure optimization."), cl::Hidden)
static bool LLVM_ATTRIBUTE_UNUSED verifyLeafProcRegUse(MachineRegisterInfo *MRI)
static bool is64Bit(const char *name)
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_def_cfa_register modifies a rule for computing CFA.
static MCCFIInstruction createRegister(MCSymbol *L, unsigned Register1, unsigned Register2, SMLoc Loc={})
.cfi_register Previous value of Register1 is saved in register Register2.
static MCCFIInstruction createWindowSave(MCSymbol *L, SMLoc Loc={})
.cfi_window_save SPARC register window is saved.
bool isLiveIn(MCPhysReg Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
void removeLiveIn(MCPhysReg Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Remove the specified register from the live in set.
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 adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
bool hasCalls() const
Return true if the current function has any function calls.
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
Align getMaxAlign() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
void setStackSize(uint64_t Size)
Set the size of the stack.
unsigned addFrameInst(const MCCFIInstruction &Inst)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool hasInlineAsm() const
Returns true if the function contains any inline assembly.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineBasicBlock & front() const
const MachineInstrBuilder & addCFIIndex(unsigned CFIIndex) 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.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
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.
SparcFrameLowering(const SparcSubtarget &ST)
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) 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 hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
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...
MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const override
This method is called during prolog/epilog code insertion to eliminate call frame setup and destroy p...
bool hasReservedCallFrame(const MachineFunction &MF) const override
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
void setLeafProc(bool rhs)
const SparcRegisterInfo * getRegisterInfo() const override
int64_t getStackPointerBias() const
The 64-bit ABI uses biased stack and frame pointers, so the stack frame of the current function is th...
int getAdjustedFrameSize(int stackSize) const
Given a actual stack size as determined by FrameInfo, this function returns adjusted framesize which ...
const SparcInstrInfo * getInstrInfo() const override
StackOffset holds a fixed and a scalable offset in bytes.
int64_t getFixed() const
Returns the fixed component of the stack.
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...
bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
bool hasStackRealignment(const MachineFunction &MF) const
True if stack realignment is required and still possible.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetInstrInfo * getInstrInfo() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
static unsigned HI22(int64_t imm)
static unsigned HIX22(int64_t imm)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
static unsigned LOX10(int64_t imm)
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
static unsigned LO10(int64_t imm)
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.
bool canRealignStack(const MachineFunction &MF) const override
Register getFrameRegister(const MachineFunction &MF) const override