mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 21:00:29 +00:00
Move hasFP() and few related hooks to TargetFrameInfo.
llvm-svn: 119740
This commit is contained in:
parent
9327aedbea
commit
269e7d3be1
@ -105,6 +105,32 @@ public:
|
||||
virtual void emitPrologue(MachineFunction &MF) const = 0;
|
||||
virtual void emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB) const = 0;
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated
|
||||
/// frame pointer register. For most targets this is true only if the function
|
||||
/// has variable sized allocas or if frame pointer elimination is disabled.
|
||||
virtual bool hasFP(const MachineFunction &MF) const = 0;
|
||||
|
||||
/// hasReservedCallFrame - Under normal circumstances, when a frame pointer is
|
||||
/// not required, we reserve argument space for call sites in the function
|
||||
/// immediately on entry to the current function. This eliminates the need for
|
||||
/// add/sub sp brackets around call sites. Returns true if the call frame is
|
||||
/// included as part of the stack frame.
|
||||
virtual bool hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
return !hasFP(MF);
|
||||
}
|
||||
|
||||
/// canSimplifyCallFramePseudos - When possible, it's best to simplify the
|
||||
/// call frame pseudo ops before doing frame index elimination. This is
|
||||
/// possible only when frame index references between the pseudos won't
|
||||
/// need adjusting for the call frame adjustments. Normally, that's true
|
||||
/// if the function has a reserved call frame or a frame pointer. Some
|
||||
/// targets (Thumb2, for example) may have more complicated criteria,
|
||||
/// however, and can override this behavior.
|
||||
virtual bool canSimplifyCallFramePseudos(const MachineFunction &MF) const {
|
||||
return hasReservedCallFrame(MF) || hasFP(MF);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -596,31 +596,6 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated
|
||||
/// frame pointer register. For most targets this is true only if the function
|
||||
/// has variable sized allocas or if frame pointer elimination is disabled.
|
||||
virtual bool hasFP(const MachineFunction &MF) const = 0;
|
||||
|
||||
/// hasReservedCallFrame - Under normal circumstances, when a frame pointer is
|
||||
/// not required, we reserve argument space for call sites in the function
|
||||
/// immediately on entry to the current function. This eliminates the need for
|
||||
/// add/sub sp brackets around call sites. Returns true if the call frame is
|
||||
/// included as part of the stack frame.
|
||||
virtual bool hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
return !hasFP(MF);
|
||||
}
|
||||
|
||||
/// canSimplifyCallFramePseudos - When possible, it's best to simplify the
|
||||
/// call frame pseudo ops before doing frame index elimination. This is
|
||||
/// possible only when frame index references between the pseudos won't
|
||||
/// need adjusting for the call frame adjustments. Normally, that's true
|
||||
/// if the function has a reserved call frame or a frame pointer. Some
|
||||
/// targets (Thumb2, for example) may have more complicated criteria,
|
||||
/// however, and can override this behavior.
|
||||
virtual bool canSimplifyCallFramePseudos(const MachineFunction &MF) const {
|
||||
return hasReservedCallFrame(MF) || hasFP(MF);
|
||||
}
|
||||
|
||||
/// hasReservedSpillSlot - Return true if target has reserved a spill slot in
|
||||
/// the stack frame of the given function for the specified register. e.g. On
|
||||
/// x86, if the frame register is required, the first fixed stack object is
|
||||
|
@ -142,6 +142,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
/// pseudo instructions.
|
||||
void PEI::calculateCallsInformation(MachineFunction &Fn) {
|
||||
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = Fn.getTarget().getFrameInfo();
|
||||
MachineFrameInfo *MFI = Fn.getFrameInfo();
|
||||
|
||||
unsigned MaxCallFrameSize = 0;
|
||||
@ -184,7 +185,7 @@ void PEI::calculateCallsInformation(MachineFunction &Fn) {
|
||||
// the target doesn't indicate otherwise, remove the call frame pseudos
|
||||
// here. The sub/add sp instruction pairs are still inserted, but we don't
|
||||
// need to track the SP adjustment for frame index elimination.
|
||||
if (RegInfo->canSimplifyCallFramePseudos(Fn))
|
||||
if (TFI->canSimplifyCallFramePseudos(Fn))
|
||||
RegInfo->eliminateCallFramePseudoInstr(Fn, *I->getParent(), I);
|
||||
}
|
||||
}
|
||||
@ -553,7 +554,7 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
||||
// Make sure the special register scavenging spill slot is closest to the
|
||||
// frame pointer if a frame pointer is required.
|
||||
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
||||
if (RS && RegInfo->hasFP(Fn) && !RegInfo->needsStackRealignment(Fn)) {
|
||||
if (RS && TFI.hasFP(Fn) && !RegInfo->needsStackRealignment(Fn)) {
|
||||
int SFI = RS->getScavengingFrameIndex();
|
||||
if (SFI >= 0)
|
||||
AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign);
|
||||
@ -635,7 +636,7 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
||||
|
||||
// Make sure the special register scavenging spill slot is closest to the
|
||||
// stack pointer.
|
||||
if (RS && (!RegInfo->hasFP(Fn) || RegInfo->needsStackRealignment(Fn))) {
|
||||
if (RS && (!TFI.hasFP(Fn) || RegInfo->needsStackRealignment(Fn))) {
|
||||
int SFI = RS->getScavengingFrameIndex();
|
||||
if (SFI >= 0)
|
||||
AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign);
|
||||
@ -645,7 +646,7 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
||||
// If we have reserved argument space for call sites in the function
|
||||
// immediately on entry to the current function, count it as part of the
|
||||
// overall stack size.
|
||||
if (MFI->adjustsStack() && RegInfo->hasReservedCallFrame(Fn))
|
||||
if (MFI->adjustsStack() && TFI.hasReservedCallFrame(Fn))
|
||||
Offset += MFI->getMaxCallFrameSize();
|
||||
|
||||
// Round up the size to a multiple of the alignment. If the function has
|
||||
|
@ -85,12 +85,14 @@ ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector ARMBaseRegisterInfo::
|
||||
getReservedRegs(const MachineFunction &MF) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
// FIXME: avoid re-calculating this everytime.
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(ARM::SP);
|
||||
Reserved.set(ARM::PC);
|
||||
Reserved.set(ARM::FPSCR);
|
||||
if (hasFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
Reserved.set(FramePtr);
|
||||
if (hasBasePointer(MF))
|
||||
Reserved.set(BasePtr);
|
||||
@ -102,6 +104,8 @@ getReservedRegs(const MachineFunction &MF) const {
|
||||
|
||||
bool ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF,
|
||||
unsigned Reg) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
switch (Reg) {
|
||||
default: break;
|
||||
case ARM::SP:
|
||||
@ -113,7 +117,7 @@ bool ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF,
|
||||
break;
|
||||
case ARM::R7:
|
||||
case ARM::R11:
|
||||
if (FramePtr == Reg && hasFP(MF))
|
||||
if (FramePtr == Reg && TFI->hasFP(MF))
|
||||
return true;
|
||||
break;
|
||||
case ARM::R9:
|
||||
@ -349,6 +353,7 @@ std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator>
|
||||
ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC,
|
||||
unsigned HintType, unsigned HintReg,
|
||||
const MachineFunction &MF) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
// Alternative register allocation orders when favoring even / odd registers
|
||||
// of register pairs.
|
||||
|
||||
@ -430,7 +435,7 @@ ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC,
|
||||
return std::make_pair(RC->allocation_order_begin(MF),
|
||||
RC->allocation_order_end(MF));
|
||||
|
||||
if (!hasFP(MF)) {
|
||||
if (!TFI->hasFP(MF)) {
|
||||
if (!STI.isR9Reserved())
|
||||
return std::make_pair(GPREven1,
|
||||
GPREven1 + (sizeof(GPREven1)/sizeof(unsigned)));
|
||||
@ -459,7 +464,7 @@ ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC,
|
||||
return std::make_pair(RC->allocation_order_begin(MF),
|
||||
RC->allocation_order_end(MF));
|
||||
|
||||
if (!hasFP(MF)) {
|
||||
if (!TFI->hasFP(MF)) {
|
||||
if (!STI.isR9Reserved())
|
||||
return std::make_pair(GPROdd1,
|
||||
GPROdd1 + (sizeof(GPROdd1)/sizeof(unsigned)));
|
||||
@ -524,23 +529,6 @@ ARMBaseRegisterInfo::UpdateRegAllocHint(unsigned Reg, unsigned NewReg,
|
||||
}
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
///
|
||||
bool ARMBaseRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
// Mac OS X requires FP not to be clobbered for backtracing purpose.
|
||||
if (STI.isTargetDarwin())
|
||||
return true;
|
||||
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
// Always eliminate non-leaf frame pointers.
|
||||
return ((DisableFramePointerElim(MF) && MFI->hasCalls()) ||
|
||||
needsStackRealignment(MF) ||
|
||||
MFI->hasVarSizedObjects() ||
|
||||
MFI->isFrameAddressTaken());
|
||||
}
|
||||
|
||||
bool ARMBaseRegisterInfo::hasBasePointer(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
@ -626,6 +614,7 @@ static unsigned estimateStackSize(MachineFunction &MF) {
|
||||
/// instructions will require a scratch register during their expansion later.
|
||||
unsigned
|
||||
ARMBaseRegisterInfo::estimateRSStackSizeLimit(MachineFunction &MF) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned Limit = (1 << 12) - 1;
|
||||
for (MachineFunction::iterator BB = MF.begin(),E = MF.end(); BB != E; ++BB) {
|
||||
@ -654,7 +643,7 @@ ARMBaseRegisterInfo::estimateRSStackSizeLimit(MachineFunction &MF) const {
|
||||
case ARMII::AddrModeT2_i12:
|
||||
// i12 supports only positive offset so these will be converted to
|
||||
// i8 opcodes. See llvm::rewriteT2FrameIndex.
|
||||
if (hasFP(MF) && AFI->hasStackFrame())
|
||||
if (TFI->hasFP(MF) && AFI->hasStackFrame())
|
||||
Limit = std::min(Limit, (1U << 8) - 1);
|
||||
break;
|
||||
case ARMII::AddrMode4:
|
||||
@ -699,6 +688,7 @@ ARMBaseRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
unsigned NumGPRSpills = 0;
|
||||
SmallVector<unsigned, 4> UnspilledCS1GPRs;
|
||||
SmallVector<unsigned, 4> UnspilledCS2GPRs;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
@ -813,10 +803,10 @@ ARMBaseRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
// worth the effort and added fragility?
|
||||
bool BigStack =
|
||||
(RS &&
|
||||
(estimateStackSize(MF) + ((hasFP(MF) && AFI->hasStackFrame()) ? 4:0) >=
|
||||
(estimateStackSize(MF) + ((TFI->hasFP(MF) && AFI->hasStackFrame()) ? 4:0) >=
|
||||
estimateRSStackSizeLimit(MF)))
|
||||
|| MFI->hasVarSizedObjects()
|
||||
|| (MFI->adjustsStack() && !canSimplifyCallFramePseudos(MF));
|
||||
|| (MFI->adjustsStack() && !TFI->canSimplifyCallFramePseudos(MF));
|
||||
|
||||
bool ExtraCSSpill = false;
|
||||
if (BigStack || !CanEliminateFrame || cannotEliminateFrame(MF)) {
|
||||
@ -834,7 +824,7 @@ ARMBaseRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
ExtraCSSpill = true;
|
||||
}
|
||||
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
MF.getRegInfo().setPhysRegUsed(FramePtr);
|
||||
NumGPRSpills++;
|
||||
}
|
||||
@ -927,7 +917,9 @@ unsigned ARMBaseRegisterInfo::getRARegister() const {
|
||||
|
||||
unsigned
|
||||
ARMBaseRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
if (hasFP(MF))
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (TFI->hasFP(MF))
|
||||
return FramePtr;
|
||||
return ARM::SP;
|
||||
}
|
||||
@ -948,6 +940,7 @@ ARMBaseRegisterInfo::ResolveFrameIndexReference(const MachineFunction &MF,
|
||||
unsigned &FrameReg,
|
||||
int SPAdj) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
int Offset = MFI->getObjectOffset(FI) + MFI->getStackSize();
|
||||
int FPOffset = Offset - AFI->getFramePtrSpillOffset();
|
||||
@ -965,7 +958,7 @@ ARMBaseRegisterInfo::ResolveFrameIndexReference(const MachineFunction &MF,
|
||||
// When dynamically realigning the stack, use the frame pointer for
|
||||
// parameters, and the stack/base pointer for locals.
|
||||
if (needsStackRealignment(MF)) {
|
||||
assert (hasFP(MF) && "dynamic stack realignment without a FP!");
|
||||
assert (TFI->hasFP(MF) && "dynamic stack realignment without a FP!");
|
||||
if (isFixed) {
|
||||
FrameReg = getFrameRegister(MF);
|
||||
Offset = FPOffset;
|
||||
@ -978,7 +971,7 @@ ARMBaseRegisterInfo::ResolveFrameIndexReference(const MachineFunction &MF,
|
||||
}
|
||||
|
||||
// If there is a frame pointer, use it when we can.
|
||||
if (hasFP(MF) && AFI->hasStackFrame()) {
|
||||
if (TFI->hasFP(MF) && AFI->hasStackFrame()) {
|
||||
// Use frame pointer to reference fixed objects. Use it for locals if
|
||||
// there are VLAs (and thus the SP isn't reliable as a base).
|
||||
if (isFixed || (MFI->hasVarSizedObjects() && !hasBasePointer(MF))) {
|
||||
@ -1252,34 +1245,6 @@ requiresVirtualBaseRegisters(const MachineFunction &MF) const {
|
||||
return EnableLocalStackAlloc;
|
||||
}
|
||||
|
||||
// hasReservedCallFrame - Under normal circumstances, when a frame pointer is
|
||||
// not required, we reserve argument space for call sites in the function
|
||||
// immediately on entry to the current function. This eliminates the need for
|
||||
// add/sub sp brackets around call sites. Returns true if the call frame is
|
||||
// included as part of the stack frame.
|
||||
bool ARMBaseRegisterInfo::
|
||||
hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
unsigned CFSize = FFI->getMaxCallFrameSize();
|
||||
// It's not always a good idea to include the call frame as part of the
|
||||
// stack frame. ARM (especially Thumb) has small immediate offset to
|
||||
// address the stack frame. So a large call frame can cause poor codegen
|
||||
// and may even makes it impossible to scavenge a register.
|
||||
if (CFSize >= ((1 << 12) - 1) / 2) // Half of imm12
|
||||
return false;
|
||||
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// canSimplifyCallFramePseudos - If there is a reserved call frame, the
|
||||
// call frame pseudos can be simplified. Unlike most targets, having a FP
|
||||
// is not sufficient here since we still may reference some objects via SP
|
||||
// even when FP is available in Thumb2 mode.
|
||||
bool ARMBaseRegisterInfo::
|
||||
canSimplifyCallFramePseudos(const MachineFunction &MF) const {
|
||||
return hasReservedCallFrame(MF) || MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
static void
|
||||
emitSPUpdate(bool isARM,
|
||||
MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
|
||||
@ -1298,7 +1263,8 @@ emitSPUpdate(bool isARM,
|
||||
void ARMBaseRegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
if (!TFI->hasReservedCallFrame(MF)) {
|
||||
// If we have alloca, convert as follows:
|
||||
// ADJCALLSTACKDOWN -> sub, sp, sp, amount
|
||||
// ADJCALLSTACKUP -> add, sp, sp, amount
|
||||
@ -1429,6 +1395,7 @@ needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
|
||||
// Note that the incoming offset is based on the SP value at function entry,
|
||||
// so it'll be negative.
|
||||
MachineFunction &MF = *MI->getParent()->getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
|
||||
@ -1456,7 +1423,7 @@ needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
|
||||
// don't know for sure yet whether we'll need that, so we guess based
|
||||
// on whether there are any local variables that would trigger it.
|
||||
unsigned StackAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
|
||||
if (hasFP(MF) &&
|
||||
if (TFI->hasFP(MF) &&
|
||||
!((MFI->getLocalFrameMaxAlign() > StackAlign) && canRealignStack(MF))) {
|
||||
if (isFrameOffsetLegal(MI, FPOffset))
|
||||
return false;
|
||||
|
@ -139,7 +139,6 @@ public:
|
||||
void UpdateRegAllocHint(unsigned Reg, unsigned NewReg,
|
||||
MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
bool hasBasePointer(const MachineFunction &MF) const;
|
||||
|
||||
bool canRealignStack(const MachineFunction &MF) const;
|
||||
@ -196,9 +195,6 @@ public:
|
||||
|
||||
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const;
|
||||
|
||||
virtual bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
virtual bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
|
||||
|
||||
virtual void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/Target/TargetFrameInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/raw_ostream.h" // FIXME: for debug only. remove!
|
||||
using namespace llvm;
|
||||
@ -600,6 +601,7 @@ bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &MBB) {
|
||||
|
||||
case ARM::Int_eh_sjlj_dispatchsetup: {
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
const ARMBaseInstrInfo *AII =
|
||||
static_cast<const ARMBaseInstrInfo*>(TII);
|
||||
const ARMBaseRegisterInfo &RI = AII->getRegisterInfo();
|
||||
@ -610,7 +612,7 @@ bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &MBB) {
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
int32_t NumBytes = AFI->getFramePtrSpillOffset();
|
||||
unsigned FramePtr = RI.getFrameRegister(MF);
|
||||
assert (RI.hasFP(MF) && "base pointer without frame pointer?");
|
||||
assert (TFI->hasFP(MF) && "base pointer without frame pointer?");
|
||||
|
||||
if (AFI->isThumb2Function()) {
|
||||
llvm::emitT2RegPlusImmediate(MBB, MBBI, MI.getDebugLoc(), ARM::R6,
|
||||
|
@ -17,9 +17,55 @@
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
///
|
||||
bool ARMFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
|
||||
|
||||
// Mac OS X requires FP not to be clobbered for backtracing purpose.
|
||||
if (STI.isTargetDarwin())
|
||||
return true;
|
||||
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
// Always eliminate non-leaf frame pointers.
|
||||
return ((DisableFramePointerElim(MF) && MFI->hasCalls()) ||
|
||||
RegInfo->needsStackRealignment(MF) ||
|
||||
MFI->hasVarSizedObjects() ||
|
||||
MFI->isFrameAddressTaken());
|
||||
}
|
||||
|
||||
// hasReservedCallFrame - Under normal circumstances, when a frame pointer is
|
||||
// not required, we reserve argument space for call sites in the function
|
||||
// immediately on entry to the current function. This eliminates the need for
|
||||
// add/sub sp brackets around call sites. Returns true if the call frame is
|
||||
// included as part of the stack frame.
|
||||
bool ARMFrameInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
unsigned CFSize = FFI->getMaxCallFrameSize();
|
||||
// It's not always a good idea to include the call frame as part of the
|
||||
// stack frame. ARM (especially Thumb) has small immediate offset to
|
||||
// address the stack frame. So a large call frame can cause poor codegen
|
||||
// and may even makes it impossible to scavenge a register.
|
||||
if (CFSize >= ((1 << 12) - 1) / 2) // Half of imm12
|
||||
return false;
|
||||
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// canSimplifyCallFramePseudos - If there is a reserved call frame, the
|
||||
// call frame pseudos can be simplified. Unlike most targets, having a FP
|
||||
// is not sufficient here since we still may reference some objects via SP
|
||||
// even when FP is available in Thumb2 mode.
|
||||
bool ARMFrameInfo::canSimplifyCallFramePseudos(const MachineFunction &MF)const {
|
||||
return hasReservedCallFrame(MF) || MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) {
|
||||
for (unsigned i = 0; CSRegs[i]; ++i)
|
||||
if (Reg == CSRegs[i])
|
||||
@ -136,7 +182,7 @@ void ARMFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
// Otherwise, if this is not Darwin, all the callee-saved registers go
|
||||
// into spill area 1, including the FP in R11. In either case, it is
|
||||
// now safe to emit this assignment.
|
||||
bool HasFP = RegInfo->hasFP(MF);
|
||||
bool HasFP = hasFP(MF);
|
||||
if (HasFP) {
|
||||
unsigned ADDriOpc = !AFI->isThumbFunction() ? ARM::ADDri : ARM::t2ADDri;
|
||||
MachineInstrBuilder MIB =
|
||||
@ -170,7 +216,7 @@ void ARMFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
AFI->setShouldRestoreSPFromFP(true);
|
||||
}
|
||||
|
||||
if (STI.isTargetELF() && RegInfo->hasFP(MF)) {
|
||||
if (STI.isTargetELF() && hasFP(MF)) {
|
||||
MFI->setOffsetAdjustment(MFI->getOffsetAdjustment() -
|
||||
AFI->getFramePtrSpillOffset());
|
||||
AFI->setShouldRestoreSPFromFP(true);
|
||||
|
@ -34,6 +34,10 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -891,13 +891,15 @@ Sched::Preference ARMTargetLowering::getSchedulingPreference(SDNode *N) const {
|
||||
unsigned
|
||||
ARMTargetLowering::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
switch (RC->getID()) {
|
||||
default:
|
||||
return 0;
|
||||
case ARM::tGPRRegClassID:
|
||||
return RegInfo->hasFP(MF) ? 4 : 5;
|
||||
return TFI->hasFP(MF) ? 4 : 5;
|
||||
case ARM::GPRRegClassID: {
|
||||
unsigned FP = RegInfo->hasFP(MF) ? 1 : 0;
|
||||
unsigned FP = TFI->hasFP(MF) ? 1 : 0;
|
||||
return 10 - FP - (Subtarget->isR9Reserved() ? 1 : 0);
|
||||
}
|
||||
case ARM::SPRRegClassID: // Currently not used as 'rep' register class.
|
||||
|
@ -20,6 +20,19 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
bool Thumb1FrameInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
unsigned CFSize = FFI->getMaxCallFrameSize();
|
||||
// It's not always a good idea to include the call frame as part of the
|
||||
// stack frame. ARM (especially Thumb) has small immediate offset to
|
||||
// address the stack frame. So a large call frame can cause poor codegen
|
||||
// and may even makes it impossible to scavenge a register.
|
||||
if (CFSize >= ((1 << 8) - 1) * 4 / 2) // Half of imm8 * 4
|
||||
return false;
|
||||
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
static void emitSPUpdate(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator &MBBI,
|
||||
const TargetInstrInfo &TII, DebugLoc dl,
|
||||
@ -105,7 +118,7 @@ void Thumb1FrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
}
|
||||
|
||||
// Adjust FP so it point to the stack slot that contains the previous FP.
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDrSPi), FramePtr)
|
||||
.addFrameIndex(FramePtrSpillFI).addImm(0);
|
||||
AFI->setShouldRestoreSPFromFP(true);
|
||||
@ -126,7 +139,7 @@ void Thumb1FrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes);
|
||||
}
|
||||
|
||||
if (STI.isTargetELF() && RegInfo->hasFP(MF))
|
||||
if (STI.isTargetELF() && hasFP(MF))
|
||||
MFI->setOffsetAdjustment(MFI->getOffsetAdjustment() -
|
||||
AFI->getFramePtrSpillOffset());
|
||||
|
||||
|
@ -34,6 +34,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -68,19 +68,6 @@ void Thumb1RegisterInfo::emitLoadConstPool(MachineBasicBlock &MBB,
|
||||
.addConstantPoolIndex(Idx).addImm(Pred).addReg(PredReg);
|
||||
}
|
||||
|
||||
bool Thumb1RegisterInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
unsigned CFSize = FFI->getMaxCallFrameSize();
|
||||
// It's not always a good idea to include the call frame as part of the
|
||||
// stack frame. ARM (especially Thumb) has small immediate offset to
|
||||
// address the stack frame. So a large call frame can cause poor codegen
|
||||
// and may even makes it impossible to scavenge a register.
|
||||
if (CFSize >= ((1 << 8) - 1) * 4 / 2) // Half of imm8 * 4
|
||||
return false;
|
||||
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
|
||||
/// emitThumbRegPlusImmInReg - Emits a series of instructions to materialize
|
||||
/// a destreg = basereg + immediate in Thumb code. Materialize the immediate
|
||||
@ -303,7 +290,9 @@ static void emitSPUpdate(MachineBasicBlock &MBB,
|
||||
void Thumb1RegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (!TFI->hasReservedCallFrame(MF)) {
|
||||
// If we have alloca, convert as follows:
|
||||
// ADJCALLSTACKDOWN -> sub, sp, sp, amount
|
||||
// ADJCALLSTACKUP -> add, sp, sp, amount
|
||||
@ -583,6 +572,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
DebugLoc dl = MI.getDebugLoc();
|
||||
|
||||
@ -601,7 +591,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
else if (AFI->isGPRCalleeSavedArea2Frame(FrameIndex))
|
||||
Offset -= AFI->getGPRCalleeSavedArea2Offset();
|
||||
else if (MF.getFrameInfo()->hasVarSizedObjects()) {
|
||||
assert(SPAdj == 0 && hasFP(MF) && "Unexpected");
|
||||
assert(SPAdj == 0 && TFI->hasFP(MF) && "Unexpected");
|
||||
// There are alloca()'s in this function, must reference off the frame
|
||||
// pointer or base pointer instead.
|
||||
if (!hasBasePointer(MF)) {
|
||||
|
@ -38,8 +38,6 @@ public:
|
||||
unsigned PredReg = 0) const;
|
||||
|
||||
/// Code Generation virtual methods...
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -34,17 +34,23 @@ static long getLower16(long l) {
|
||||
return l - h * Alpha::IMM_MULT;
|
||||
}
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
//
|
||||
bool AlphaFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void AlphaFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const AlphaRegisterInfo *RegInfo =
|
||||
static_cast<const AlphaRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const AlphaInstrInfo &TII =
|
||||
*static_cast<const AlphaInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
|
||||
|
||||
DebugLoc dl = (MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc());
|
||||
bool FP = RegInfo->hasFP(MF);
|
||||
bool FP = hasFP(MF);
|
||||
|
||||
// Handle GOP offset
|
||||
BuildMI(MBB, MBBI, dl, TII.get(Alpha::LDAHg), Alpha::R29)
|
||||
@ -99,17 +105,14 @@ void AlphaFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MachineBasicBlock::iterator MBBI = prior(MBB.end());
|
||||
const AlphaRegisterInfo *RegInfo =
|
||||
static_cast<const AlphaRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const AlphaInstrInfo &TII =
|
||||
*static_cast<const AlphaInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
|
||||
|
||||
assert((MBBI->getOpcode() == Alpha::RETDAG ||
|
||||
MBBI->getOpcode() == Alpha::RETDAGp)
|
||||
&& "Can only insert epilog into returning blocks");
|
||||
DebugLoc dl = MBBI->getDebugLoc();
|
||||
|
||||
bool FP = RegInfo->hasFP(MF);
|
||||
bool FP = hasFP(MF);
|
||||
|
||||
// Get the number of bytes allocated from the FrameInfo...
|
||||
long NumBytes = MFI->getStackSize();
|
||||
|
@ -34,6 +34,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -78,19 +78,12 @@ BitVector AlphaRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
//
|
||||
bool AlphaRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void AlphaRegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (hasFP(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (TFI->hasFP(MF)) {
|
||||
// If we have a frame pointer, turn the adjcallstackup instruction into a
|
||||
// 'sub ESP, <amt>' and the adjcallstackdown instruction into 'add ESP,
|
||||
// <amt>'
|
||||
@ -138,7 +131,9 @@ AlphaRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
bool FP = hasFP(MF);
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
bool FP = TFI->hasFP(MF);
|
||||
|
||||
while (!MI.getOperand(i).isFI()) {
|
||||
++i;
|
||||
@ -183,7 +178,9 @@ unsigned AlphaRegisterInfo::getRARegister() const {
|
||||
}
|
||||
|
||||
unsigned AlphaRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
return hasFP(MF) ? Alpha::R15 : Alpha::R30;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
return TFI->hasFP(MF) ? Alpha::R15 : Alpha::R30;
|
||||
}
|
||||
|
||||
unsigned AlphaRegisterInfo::getEHExceptionRegister() const {
|
||||
|
@ -32,8 +32,6 @@ struct AlphaRegisterInfo : public AlphaGenRegisterInfo {
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -16,10 +16,20 @@
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
bool BlackfinFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) ||
|
||||
MFI->adjustsStack() || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// Emit a prologue that sets up a stack frame.
|
||||
// On function entry, R0-R2 and P0 may hold arguments.
|
||||
// R3, P1, and P2 may be used as scratch registers
|
||||
@ -40,7 +50,7 @@ void BlackfinFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MFI->setStackSize(FrameSize);
|
||||
}
|
||||
|
||||
if (!RegInfo->hasFP(MF)) {
|
||||
if (!hasFP(MF)) {
|
||||
assert(!MFI->adjustsStack() &&
|
||||
"FP elimination on a non-leaf function is not supported");
|
||||
RegInfo->adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, -FrameSize);
|
||||
@ -85,7 +95,7 @@ void BlackfinFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
int FrameSize = MFI->getStackSize();
|
||||
assert(FrameSize%4 == 0 && "Misaligned frame size");
|
||||
|
||||
if (!RegInfo->hasFP(MF)) {
|
||||
if (!hasFP(MF)) {
|
||||
assert(!MFI->adjustsStack() &&
|
||||
"FP elimination on a non-leaf function is not supported");
|
||||
RegInfo->adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, FrameSize);
|
||||
|
@ -34,6 +34,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -50,6 +50,8 @@ BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector
|
||||
BlackfinRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
using namespace BF;
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(AZ);
|
||||
@ -70,20 +72,11 @@ BlackfinRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
Reserved.set(L3);
|
||||
Reserved.set(SP);
|
||||
Reserved.set(RETS);
|
||||
if (hasFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
Reserved.set(FP);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
bool BlackfinRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) ||
|
||||
MFI->adjustsStack() || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
bool BlackfinRegisterInfo::
|
||||
requiresRegisterScavenging(const MachineFunction &MF) const {
|
||||
return true;
|
||||
@ -161,7 +154,9 @@ void BlackfinRegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (!TFI->hasReservedCallFrame(MF)) {
|
||||
int64_t Amount = I->getOperand(0).getImm();
|
||||
if (Amount != 0) {
|
||||
assert(Amount%4 == 0 && "Unaligned call frame size");
|
||||
@ -196,6 +191,7 @@ BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
DebugLoc DL = MI.getDebugLoc();
|
||||
|
||||
unsigned FIPos;
|
||||
@ -208,7 +204,7 @@ BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex)
|
||||
+ MI.getOperand(FIPos+1).getImm();
|
||||
unsigned BaseReg = BF::FP;
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
assert(SPAdj==0 && "Unexpected SP adjust in function with frame pointer");
|
||||
} else {
|
||||
BaseReg = BF::SP;
|
||||
@ -348,7 +344,9 @@ unsigned BlackfinRegisterInfo::getRARegister() const {
|
||||
|
||||
unsigned
|
||||
BlackfinRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
return hasFP(MF) ? BF::FP : BF::SP;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
return TFI->hasFP(MF) ? BF::FP : BF::SP;
|
||||
}
|
||||
|
||||
unsigned BlackfinRegisterInfo::getEHExceptionRegister() const {
|
||||
|
@ -41,8 +41,6 @@ namespace llvm {
|
||||
return &BF::PRegClass;
|
||||
}
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
// bool hasReservedCallFrame(MachineFunction &MF) const;
|
||||
|
||||
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
||||
|
@ -252,9 +252,9 @@ def P : RegisterClass<"BF", [i32], 32, [P0, P1, P2, P3, P4, P5, FP, SP]> {
|
||||
PClass::iterator
|
||||
PClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
return allocation_order_begin(MF)
|
||||
+ (RI->hasFP(MF) ? 7 : 6);
|
||||
+ (TFI->hasFP(MF) ? 7 : 6);
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -275,9 +275,9 @@ def DP : RegisterClass<"BF", [i32], 32,
|
||||
DPClass::iterator
|
||||
DPClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
return allocation_order_begin(MF)
|
||||
+ (RI->hasFP(MF) ? 15 : 14);
|
||||
+ (TFI->hasFP(MF) ? 15 : 14);
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -295,9 +295,9 @@ def GR : RegisterClass<"BF", [i32], 32,
|
||||
GRClass::iterator
|
||||
GRClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
return allocation_order_begin(MF)
|
||||
+ (RI->hasFP(MF) ? 31 : 30);
|
||||
+ (TFI->hasFP(MF) ? 31 : 30);
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -318,9 +318,9 @@ def ALL : RegisterClass<"BF", [i32], 32,
|
||||
ALLClass::iterator
|
||||
ALLClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
return allocation_order_begin(MF)
|
||||
+ (RI->hasFP(MF) ? 31 : 30);
|
||||
+ (TFI->hasFP(MF) ? 31 : 30);
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -334,9 +334,9 @@ def PI : RegisterClass<"BF", [i32], 32,
|
||||
PIClass::iterator
|
||||
PIClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
return allocation_order_begin(MF)
|
||||
+ (RI->hasFP(MF) ? 11 : 10);
|
||||
+ (TFI->hasFP(MF) ? 11 : 10);
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
@ -39,6 +39,18 @@ SPUFrameInfo::SPUFrameInfo(const SPUSubtarget &sti)
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// hasFP - Return true if the specified function actually has a dedicated frame
|
||||
// pointer register. This is true if the function needs a frame pointer and has
|
||||
// a non-zero stack size.
|
||||
bool SPUFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
return MFI->getStackSize() &&
|
||||
(DisableFramePointerElim(MF) || MFI->hasVarSizedObjects());
|
||||
}
|
||||
|
||||
|
||||
/// determineFrameLayout - Determine the size of the frame and maximum call
|
||||
/// frame size.
|
||||
void SPUFrameInfo::determineFrameLayout(MachineFunction &MF) const {
|
||||
|
@ -37,6 +37,9 @@ namespace llvm {
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
//! Prediate: Target has dedicated frame pointer
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
//! Return a function's saved spill slots
|
||||
/*!
|
||||
For CellSPU, a function's saved spill slots is just the link register.
|
||||
|
@ -240,25 +240,6 @@ BitVector SPURegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// needsFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
//
|
||||
static bool needsFP(const MachineFunction &MF) {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// hasFP - Return true if the specified function actually has a dedicated frame
|
||||
// pointer register. This is true if the function needs a frame pointer and has
|
||||
// a non-zero stack size.
|
||||
bool
|
||||
SPURegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return MFI->getStackSize() && needsFP(MF);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
void
|
||||
SPURegisterInfo::eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
@ -56,8 +56,6 @@ namespace llvm {
|
||||
//! Return the reserved registers
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
//! Prediate: Target has dedicated frame pointer
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
//! Eliminate the call frame setup pseudo-instructions
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
|
@ -40,11 +40,17 @@ using namespace llvm;
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
bool MBlazeFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void MBlazeFrameInfo::adjustMBlazeStackFrame(MachineFunction &MF) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
|
||||
const MBlazeRegisterInfo *RegInfo =
|
||||
static_cast<const MBlazeRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
|
||||
// See the description at MicroBlazeMachineFunction.h
|
||||
int TopCPUSavedRegOff = -1;
|
||||
@ -61,7 +67,7 @@ void MBlazeFrameInfo::adjustMBlazeStackFrame(MachineFunction &MF) const {
|
||||
MBlazeFI->adjustLoadArgsFI(MFI);
|
||||
MBlazeFI->adjustStoreVarArgsFI(MFI);
|
||||
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true),
|
||||
StackOffset);
|
||||
MBlazeFI->setFPStackOffset(StackOffset);
|
||||
@ -90,8 +96,6 @@ void MBlazeFrameInfo::adjustMBlazeStackFrame(MachineFunction &MF) const {
|
||||
void MBlazeFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const MBlazeRegisterInfo *RegInfo =
|
||||
static_cast<const MBlazeRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const MBlazeInstrInfo &TII =
|
||||
*static_cast<const MBlazeInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
|
||||
@ -124,7 +128,7 @@ void MBlazeFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
|
||||
// if framepointer enabled, save it and set it
|
||||
// to point to the stack pointer
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// swi R19, R1, stack_loc
|
||||
BuildMI(MBB, MBBI, DL, TII.get(MBlaze::SWI))
|
||||
.addReg(MBlaze::R19).addReg(MBlaze::R1).addImm(FPOffset);
|
||||
@ -139,9 +143,7 @@ void MBlazeFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB) const {
|
||||
MachineBasicBlock::iterator MBBI = prior(MBB.end());
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
|
||||
const MBlazeRegisterInfo *RegInfo =
|
||||
static_cast<const MBlazeRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
|
||||
const MBlazeInstrInfo &TII =
|
||||
*static_cast<const MBlazeInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
|
||||
@ -153,7 +155,7 @@ void MBlazeFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
|
||||
// if framepointer enabled, restore it and restore the
|
||||
// stack pointer
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// add R1, R19, R0
|
||||
BuildMI(MBB, MBBI, dl, TII.get(MBlaze::ADD), MBlaze::R1)
|
||||
.addReg(MBlaze::R19).addReg(MBlaze::R0);
|
||||
|
@ -41,6 +41,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -164,14 +164,6 @@ getReservedRegs(const MachineFunction &MF) const {
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
bool MBlazeRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// This function eliminate ADJCALLSTACKDOWN,
|
||||
// ADJCALLSTACKUP pseudo instructions
|
||||
void MBlazeRegisterInfo::
|
||||
@ -235,7 +227,9 @@ unsigned MBlazeRegisterInfo::getRARegister() const {
|
||||
}
|
||||
|
||||
unsigned MBlazeRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
return hasFP(MF) ? MBlaze::R19 : MBlaze::R1;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
return TFI->hasFP(MF) ? MBlaze::R19 : MBlaze::R1;
|
||||
}
|
||||
|
||||
unsigned MBlazeRegisterInfo::getEHExceptionRegister() const {
|
||||
|
@ -56,8 +56,6 @@ struct MBlazeRegisterInfo : public MBlazeGenRegisterInfo {
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -26,12 +26,22 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
bool MSP430FrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
return (DisableFramePointerElim(MF) ||
|
||||
MF.getFrameInfo()->hasVarSizedObjects() ||
|
||||
MFI->isFrameAddressTaken());
|
||||
}
|
||||
|
||||
bool MSP430FrameInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void MSP430FrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MSP430MachineFunctionInfo *MSP430FI = MF.getInfo<MSP430MachineFunctionInfo>();
|
||||
const MSP430RegisterInfo *RegInfo =
|
||||
static_cast<const MSP430RegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const MSP430InstrInfo &TII =
|
||||
*static_cast<const MSP430InstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
|
||||
@ -42,7 +52,7 @@ void MSP430FrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
uint64_t StackSize = MFI->getStackSize();
|
||||
|
||||
uint64_t NumBytes = 0;
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// Calculate required stack adjustment
|
||||
uint64_t FrameSize = StackSize - 2;
|
||||
NumBytes = FrameSize - MSP430FI->getCalleeSavedFrameSize();
|
||||
@ -97,8 +107,6 @@ void MSP430FrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MSP430MachineFunctionInfo *MSP430FI = MF.getInfo<MSP430MachineFunctionInfo>();
|
||||
const MSP430RegisterInfo *RegInfo =
|
||||
static_cast<const MSP430RegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const MSP430InstrInfo &TII =
|
||||
*static_cast<const MSP430InstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
|
||||
@ -118,7 +126,7 @@ void MSP430FrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
unsigned CSSize = MSP430FI->getCalleeSavedFrameSize();
|
||||
uint64_t NumBytes = 0;
|
||||
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// Calculate required stack adjustment
|
||||
uint64_t FrameSize = StackSize - 2;
|
||||
NumBytes = FrameSize - CSSize;
|
||||
|
@ -34,6 +34,9 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -38,6 +38,7 @@ MSP430RegisterInfo::MSP430RegisterInfo(MSP430TargetMachine &tm,
|
||||
|
||||
const unsigned*
|
||||
MSP430RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
const TargetFrameInfo *TFI = MF->getTarget().getFrameInfo();
|
||||
const Function* F = MF->getFunction();
|
||||
static const unsigned CalleeSavedRegs[] = {
|
||||
MSP430::FPW, MSP430::R5W, MSP430::R6W, MSP430::R7W,
|
||||
@ -62,7 +63,7 @@ MSP430RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
0
|
||||
};
|
||||
|
||||
if (hasFP(*MF))
|
||||
if (TFI->hasFP(*MF))
|
||||
return (F->getCallingConv() == CallingConv::MSP430_INTR ?
|
||||
CalleeSavedRegsIntrFP : CalleeSavedRegsFP);
|
||||
else
|
||||
@ -73,6 +74,7 @@ MSP430RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector MSP430RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
// Mark 4 special registers as reserved.
|
||||
Reserved.set(MSP430::PCW);
|
||||
@ -81,7 +83,7 @@ BitVector MSP430RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
Reserved.set(MSP430::CGW);
|
||||
|
||||
// Mark frame pointer as reserved if needed.
|
||||
if (hasFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
Reserved.set(MSP430::FPW);
|
||||
|
||||
return Reserved;
|
||||
@ -92,23 +94,12 @@ MSP430RegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
return &MSP430::GR16RegClass;
|
||||
}
|
||||
|
||||
|
||||
bool MSP430RegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
return (DisableFramePointerElim(MF) ||
|
||||
MF.getFrameInfo()->hasVarSizedObjects() ||
|
||||
MFI->isFrameAddressTaken());
|
||||
}
|
||||
|
||||
bool MSP430RegisterInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void MSP430RegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (!TFI->hasReservedCallFrame(MF)) {
|
||||
// If the stack pointer can be changed after prologue, turn the
|
||||
// adjcallstackup instruction into a 'sub SPW, <amt>' and the
|
||||
// adjcallstackdown instruction into 'add SPW, <amt>'
|
||||
@ -172,6 +163,7 @@ MSP430RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
DebugLoc dl = MI.getDebugLoc();
|
||||
while (!MI.getOperand(i).isFI()) {
|
||||
++i;
|
||||
@ -180,13 +172,13 @@ MSP430RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
|
||||
int FrameIndex = MI.getOperand(i).getIndex();
|
||||
|
||||
unsigned BasePtr = (hasFP(MF) ? MSP430::FPW : MSP430::SPW);
|
||||
unsigned BasePtr = (TFI->hasFP(MF) ? MSP430::FPW : MSP430::SPW);
|
||||
int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
|
||||
|
||||
// Skip the saved PC
|
||||
Offset += 2;
|
||||
|
||||
if (!hasFP(MF))
|
||||
if (!TFI->hasFP(MF))
|
||||
Offset += MF.getFrameInfo()->getStackSize();
|
||||
else
|
||||
Offset += 2; // Skip the saved FPW
|
||||
@ -224,8 +216,10 @@ MSP430RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
void
|
||||
MSP430RegisterInfo::processFunctionBeforeFrameFinalized(MachineFunction &MF)
|
||||
const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
// Create a frame entry for the FPW register that must be saved.
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
int FrameIdx = MF.getFrameInfo()->CreateFixedObject(2, -4, true);
|
||||
(void)FrameIdx;
|
||||
assert(FrameIdx == MF.getFrameInfo()->getObjectIndexBegin() &&
|
||||
@ -238,7 +232,9 @@ unsigned MSP430RegisterInfo::getRARegister() const {
|
||||
}
|
||||
|
||||
unsigned MSP430RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
return hasFP(MF) ? MSP430::FPW : MSP430::SPW;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
return TFI->hasFP(MF) ? MSP430::FPW : MSP430::SPW;
|
||||
}
|
||||
|
||||
int MSP430RegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
|
||||
|
@ -39,9 +39,6 @@ public:
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
const TargetRegisterClass* getPointerRegClass(unsigned Kind = 0) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -79,10 +79,10 @@ def GR8 : RegisterClass<"MSP430", [i8], 8,
|
||||
GR8Class::iterator
|
||||
GR8Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
// Depending on whether the function uses frame pointer or not, last 5 or 4
|
||||
// registers on the list above are reserved
|
||||
if (RI->hasFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
return end()-5;
|
||||
else
|
||||
return end()-4;
|
||||
@ -106,10 +106,10 @@ def GR16 : RegisterClass<"MSP430", [i16], 16,
|
||||
GR16Class::iterator
|
||||
GR16Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
// Depending on whether the function uses frame pointer or not, last 5 or 4
|
||||
// registers on the list above are reserved
|
||||
if (RI->hasFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
return end()-5;
|
||||
else
|
||||
return end()-4;
|
||||
|
@ -125,9 +125,10 @@ namespace {
|
||||
// Create a bitmask with all callee saved registers for CPU or Floating Point
|
||||
// registers. For CPU registers consider RA, GP and FP for saving if necessary.
|
||||
void MipsAsmPrinter::printSavedRegsBitmask(raw_ostream &O) {
|
||||
const TargetRegisterInfo &RI = *TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const MipsFunctionInfo *MipsFI = MF->getInfo<MipsFunctionInfo>();
|
||||
|
||||
|
||||
// CPU and FPU Saved Registers Bitmasks
|
||||
unsigned int CPUBitmask = 0;
|
||||
unsigned int FPUBitmask = 0;
|
||||
@ -145,13 +146,13 @@ void MipsAsmPrinter::printSavedRegsBitmask(raw_ostream &O) {
|
||||
}
|
||||
|
||||
// Return Address and Frame registers must also be set in CPUBitmask.
|
||||
if (RI.hasFP(*MF))
|
||||
if (TFI->hasFP(*MF))
|
||||
CPUBitmask |= (1 << MipsRegisterInfo::
|
||||
getRegisterNumbering(RI.getFrameRegister(*MF)));
|
||||
|
||||
if (MFI->adjustsStack())
|
||||
getRegisterNumbering(RI->getFrameRegister(*MF)));
|
||||
|
||||
if (MFI->adjustsStack())
|
||||
CPUBitmask |= (1 << MipsRegisterInfo::
|
||||
getRegisterNumbering(RI.getRARegister()));
|
||||
getRegisterNumbering(RI->getRARegister()));
|
||||
|
||||
// Print CPUBitmask
|
||||
O << "\t.mask \t"; printHex32(CPUBitmask, O);
|
||||
|
@ -79,11 +79,17 @@ using namespace llvm;
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
bool MipsFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void MipsFrameInfo::adjustMipsStackFrame(MachineFunction &MF) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
const MipsRegisterInfo *RegInfo =
|
||||
static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
||||
unsigned StackAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
|
||||
unsigned RegSize = STI.isGP32bit() ? 4 : 8;
|
||||
@ -152,7 +158,7 @@ void MipsFrameInfo::adjustMipsStackFrame(MachineFunction &MF) const {
|
||||
|
||||
// Stack locations for FP and RA. If only one of them is used,
|
||||
// the space must be allocated for both, otherwise no space at all.
|
||||
if (RegInfo->hasFP(MF) || MFI->adjustsStack()) {
|
||||
if (hasFP(MF) || MFI->adjustsStack()) {
|
||||
// FP stack location
|
||||
MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true),
|
||||
StackOffset);
|
||||
@ -242,7 +248,7 @@ void MipsFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
|
||||
// if framepointer enabled, save it and set it
|
||||
// to point to the stack pointer
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// sw $fp,stack_loc($sp)
|
||||
BuildMI(MBB, MBBI, dl, TII.get(Mips::SW))
|
||||
.addReg(Mips::FP).addImm(FPOffset).addReg(Mips::SP);
|
||||
@ -263,8 +269,6 @@ void MipsFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock::iterator MBBI = prior(MBB.end());
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
const MipsRegisterInfo *RegInfo =
|
||||
static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const MipsInstrInfo &TII =
|
||||
*static_cast<const MipsInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
DebugLoc dl = MBBI->getDebugLoc();
|
||||
@ -278,7 +282,7 @@ void MipsFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
|
||||
// if framepointer enabled, restore it and restore the
|
||||
// stack pointer
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// move $sp, $fp
|
||||
BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDu), Mips::SP)
|
||||
.addReg(Mips::FP).addReg(Mips::ZERO);
|
||||
|
@ -37,6 +37,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -117,8 +117,7 @@ getCalleeSavedRegs(const MachineFunction *MF) const
|
||||
}
|
||||
|
||||
BitVector MipsRegisterInfo::
|
||||
getReservedRegs(const MachineFunction &MF) const
|
||||
{
|
||||
getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(Mips::ZERO);
|
||||
Reserved.set(Mips::AT);
|
||||
@ -137,15 +136,6 @@ getReservedRegs(const MachineFunction &MF) const
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
// hasFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
bool MipsRegisterInfo::
|
||||
hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// This function eliminate ADJCALLSTACKDOWN,
|
||||
// ADJCALLSTACKUP pseudo instructions
|
||||
void MipsRegisterInfo::
|
||||
@ -209,7 +199,9 @@ getRARegister() const {
|
||||
|
||||
unsigned MipsRegisterInfo::
|
||||
getFrameRegister(const MachineFunction &MF) const {
|
||||
return hasFP(MF) ? Mips::FP : Mips::SP;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
return TFI->hasFP(MF) ? Mips::FP : Mips::SP;
|
||||
}
|
||||
|
||||
unsigned MipsRegisterInfo::
|
||||
|
@ -44,8 +44,6 @@ struct MipsRegisterInfo : public MipsGenRegisterInfo {
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -34,6 +34,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const { return false; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -38,8 +38,6 @@ struct PTXRegisterInfo : public PTXGenRegisterInfo {
|
||||
return Reserved; // reserve no regs
|
||||
}
|
||||
|
||||
virtual bool hasFP(const MachineFunction &MF) const { return false; }
|
||||
|
||||
virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
|
||||
int SPAdj,
|
||||
RegScavenger *RS = NULL) const {
|
||||
|
@ -222,12 +222,25 @@ void PPCFrameInfo::determineFrameLayout(MachineFunction &MF) const {
|
||||
MFI->setStackSize(FrameSize);
|
||||
}
|
||||
|
||||
// hasFP - Return true if the specified function actually has a dedicated frame
|
||||
// pointer register.
|
||||
bool PPCFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
// Naked functions have no stack frame pushed, so we don't have a frame
|
||||
// pointer.
|
||||
if (MF.getFunction()->hasFnAttr(Attribute::Naked))
|
||||
return false;
|
||||
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects() ||
|
||||
(GuaranteedTailCallOpt && MF.getInfo<PPCFunctionInfo>()->hasFastCall());
|
||||
}
|
||||
|
||||
|
||||
void PPCFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const PPCRegisterInfo *RegInfo =
|
||||
static_cast<const PPCRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const PPCInstrInfo &TII =
|
||||
*static_cast<const PPCInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
|
||||
@ -266,7 +279,7 @@ void PPCFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
|
||||
bool MustSaveLR = FI->mustSaveLR();
|
||||
// Do we have a frame pointer for this function?
|
||||
bool HasFP = RegInfo->hasFP(MF) && FrameSize;
|
||||
bool HasFP = hasFP(MF) && FrameSize;
|
||||
|
||||
int LROffset = PPCFrameInfo::getReturnSaveOffset(isPPC64, isDarwinABI);
|
||||
|
||||
@ -471,21 +484,19 @@ void PPCFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
void PPCFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB) const {
|
||||
MachineBasicBlock::iterator MBBI = prior(MBB.end());
|
||||
const PPCRegisterInfo *RegInfo =
|
||||
static_cast<const PPCRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const PPCInstrInfo &TII =
|
||||
*static_cast<const PPCInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
|
||||
unsigned RetOpcode = MBBI->getOpcode();
|
||||
DebugLoc dl;
|
||||
|
||||
assert( (RetOpcode == PPC::BLR ||
|
||||
RetOpcode == PPC::TCRETURNri ||
|
||||
RetOpcode == PPC::TCRETURNdi ||
|
||||
RetOpcode == PPC::TCRETURNai ||
|
||||
RetOpcode == PPC::TCRETURNri8 ||
|
||||
RetOpcode == PPC::TCRETURNdi8 ||
|
||||
RetOpcode == PPC::TCRETURNai8) &&
|
||||
assert((RetOpcode == PPC::BLR ||
|
||||
RetOpcode == PPC::TCRETURNri ||
|
||||
RetOpcode == PPC::TCRETURNdi ||
|
||||
RetOpcode == PPC::TCRETURNai ||
|
||||
RetOpcode == PPC::TCRETURNri8 ||
|
||||
RetOpcode == PPC::TCRETURNdi8 ||
|
||||
RetOpcode == PPC::TCRETURNai8) &&
|
||||
"Can only insert epilog into returning blocks");
|
||||
|
||||
// Get alignment info so we know how to restore r1
|
||||
@ -504,7 +515,7 @@ void PPCFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
|
||||
bool MustSaveLR = FI->mustSaveLR();
|
||||
// Do we have a frame pointer for this function?
|
||||
bool HasFP = RegInfo->hasFP(MF) && FrameSize;
|
||||
bool HasFP = hasFP(MF) && FrameSize;
|
||||
|
||||
int LROffset = PPCFrameInfo::getReturnSaveOffset(isPPC64, isDarwinABI);
|
||||
|
||||
@ -550,7 +561,7 @@ void PPCFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
// call which invalidates the stack pointer value in SP(0). So we use the
|
||||
// value of R31 in this case.
|
||||
if (FI->hasFastCall() && isInt<16>(FrameSize)) {
|
||||
assert(RegInfo->hasFP(MF) && "Expecting a valid the frame pointer.");
|
||||
assert(hasFP(MF) && "Expecting a valid the frame pointer.");
|
||||
BuildMI(MBB, MBBI, dl, TII.get(PPC::ADDI), PPC::R1)
|
||||
.addReg(PPC::R31).addImm(FrameSize);
|
||||
} else if(FI->hasFastCall()) {
|
||||
@ -574,7 +585,7 @@ void PPCFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
}
|
||||
} else {
|
||||
if (FI->hasFastCall() && isInt<16>(FrameSize)) {
|
||||
assert(RegInfo->hasFP(MF) && "Expecting a valid the frame pointer.");
|
||||
assert(hasFP(MF) && "Expecting a valid the frame pointer.");
|
||||
BuildMI(MBB, MBBI, dl, TII.get(PPC::ADDI8), PPC::X1)
|
||||
.addReg(PPC::X31).addImm(FrameSize);
|
||||
} else if(FI->hasFastCall()) {
|
||||
|
@ -37,6 +37,8 @@ public:
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
/// targetHandlesStackFrameRounding - Returns true if the target is
|
||||
/// responsible for rounding up the stack frame (probably at emitPrologue
|
||||
/// time).
|
||||
|
@ -259,19 +259,6 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
return Subtarget.isPPC64() ? SVR4_64_CalleeSavedRegs : SVR4_CalleeSavedRegs;
|
||||
}
|
||||
|
||||
// needsFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
//
|
||||
static bool needsFP(const MachineFunction &MF) {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
// Naked functions have no stack frame pushed, so we don't have a frame pointer.
|
||||
if (MF.getFunction()->hasFnAttr(Attribute::Naked))
|
||||
return false;
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects() ||
|
||||
(GuaranteedTailCallOpt && MF.getInfo<PPCFunctionInfo>()->hasFastCall());
|
||||
}
|
||||
|
||||
static bool spillsCR(const MachineFunction &MF) {
|
||||
const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
return FuncInfo->isCRSpilled();
|
||||
@ -279,6 +266,8 @@ static bool spillsCR(const MachineFunction &MF) {
|
||||
|
||||
BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
Reserved.set(PPC::R0);
|
||||
Reserved.set(PPC::R1);
|
||||
Reserved.set(PPC::LR);
|
||||
@ -324,7 +313,7 @@ BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
}
|
||||
}
|
||||
|
||||
if (needsFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
Reserved.set(PPC::R31);
|
||||
|
||||
return Reserved;
|
||||
@ -334,14 +323,6 @@ BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// hasFP - Return true if the specified function actually has a dedicated frame
|
||||
// pointer register. This is true if the function needs a frame pointer and has
|
||||
// a non-zero stack size.
|
||||
bool PPCRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return MFI->getStackSize() && needsFP(MF);
|
||||
}
|
||||
|
||||
/// MustSaveLR - Return true if this function requires that we save the LR
|
||||
/// register onto the stack in the prolog and restore it in the epilog of the
|
||||
/// function.
|
||||
@ -583,6 +564,7 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
// Get the frame info.
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
DebugLoc dl = MI.getDebugLoc();
|
||||
|
||||
// Find out which operand is the frame index.
|
||||
@ -622,7 +604,8 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
}
|
||||
|
||||
// Replace the FrameIndex with base register with GPR1 (SP) or GPR31 (FP).
|
||||
MI.getOperand(FIOperandNo).ChangeToRegister(hasFP(MF) ? PPC::R31 : PPC::R1,
|
||||
MI.getOperand(FIOperandNo).ChangeToRegister(TFI->hasFP(MF) ?
|
||||
PPC::R31 : PPC::R1,
|
||||
false);
|
||||
|
||||
// Figure out if the offset in the instruction is shifted right two bits. This
|
||||
@ -708,6 +691,8 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
void
|
||||
PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
RegScavenger *RS) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
// Save and clear the LR state.
|
||||
PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
|
||||
unsigned LR = getRARegister();
|
||||
@ -719,9 +704,9 @@ PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
bool isDarwinABI = Subtarget.isDarwinABI();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
|
||||
// If the frame pointer save index hasn't been defined yet.
|
||||
if (!FPSI && needsFP(MF)) {
|
||||
if (!FPSI && TFI->hasFP(MF)) {
|
||||
// Find out what the fix offset of the frame pointer save area.
|
||||
int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(isPPC64,
|
||||
isDarwinABI);
|
||||
@ -736,7 +721,7 @@ PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
if (GuaranteedTailCallOpt && (TCSPDelta = FI->getTailCallSPDelta()) < 0) {
|
||||
MF.getFrameInfo()->CreateFixedObject(-1 * TCSPDelta, TCSPDelta, true);
|
||||
}
|
||||
|
||||
|
||||
// Reserve a slot closest to SP or frame pointer if we have a dynalloc or
|
||||
// a large stack, which will require scavenging a register to materialize a
|
||||
// large offset.
|
||||
@ -745,7 +730,7 @@ PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
// r0 for now.
|
||||
|
||||
if (EnableRegisterScavenging) // FIXME (64-bit): Enable.
|
||||
if (needsFP(MF) || spillsCR(MF)) {
|
||||
if (TFI->hasFP(MF) || spillsCR(MF)) {
|
||||
const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
|
||||
const TargetRegisterClass *G8RC = &PPC::G8RCRegClass;
|
||||
const TargetRegisterClass *RC = isPPC64 ? G8RC : GPRC;
|
||||
@ -766,12 +751,13 @@ PPCRegisterInfo::processFunctionBeforeFrameFinalized(MachineFunction &MF)
|
||||
// Get callee saved register information.
|
||||
MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
const std::vector<CalleeSavedInfo> &CSI = FFI->getCalleeSavedInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
// Early exit if no callee saved registers are modified!
|
||||
if (CSI.empty() && !needsFP(MF)) {
|
||||
if (CSI.empty() && !TFI->hasFP(MF)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
unsigned MinGPR = PPC::R31;
|
||||
unsigned MinG8R = PPC::X31;
|
||||
unsigned MinFPR = PPC::F31;
|
||||
@ -858,7 +844,7 @@ PPCRegisterInfo::processFunctionBeforeFrameFinalized(MachineFunction &MF)
|
||||
|
||||
// Check whether the frame pointer register is allocated. If so, make sure it
|
||||
// is spilled to the correct offset.
|
||||
if (needsFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
HasGPSaveArea = true;
|
||||
|
||||
int FI = PFI->getFramePointerSaveIndex();
|
||||
@ -949,10 +935,12 @@ unsigned PPCRegisterInfo::getRARegister() const {
|
||||
}
|
||||
|
||||
unsigned PPCRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (!Subtarget.isPPC64())
|
||||
return hasFP(MF) ? PPC::R31 : PPC::R1;
|
||||
return TFI->hasFP(MF) ? PPC::R31 : PPC::R1;
|
||||
else
|
||||
return hasFP(MF) ? PPC::X31 : PPC::X1;
|
||||
return TFI->hasFP(MF) ? PPC::X31 : PPC::X1;
|
||||
}
|
||||
|
||||
void PPCRegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
|
||||
|
@ -48,8 +48,6 @@ public:
|
||||
/// FIXME (64-bit): Should be inlined.
|
||||
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
@ -65,9 +63,6 @@ public:
|
||||
RegScavenger *RS = NULL) const;
|
||||
void processFunctionBeforeFrameFinalized(MachineFunction &MF) const;
|
||||
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
// Debug information queries.
|
||||
unsigned getRARegister() const;
|
||||
unsigned getFrameRegister(const MachineFunction &MF) const;
|
||||
|
@ -300,13 +300,13 @@ def GPRC : RegisterClass<"PPC", [i32], 32,
|
||||
// R31 when the FP is not needed.
|
||||
// When using the 32-bit SVR4 ABI, r13 is reserved for the Small Data Area
|
||||
// pointer.
|
||||
const PPCSubtarget &Subtarget
|
||||
= MF.getTarget().getSubtarget<PPCSubtarget>();
|
||||
|
||||
const PPCSubtarget &Subtarget = MF.getTarget().getSubtarget<PPCSubtarget>();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (Subtarget.isPPC64() || Subtarget.isSVR4ABI())
|
||||
return end()-5; // don't allocate R13, R31, R0, R1, LR
|
||||
|
||||
if (needsFP(MF))
|
||||
if (TFI->hasFP(MF))
|
||||
return end()-4; // don't allocate R31, R0, R1, LR
|
||||
else
|
||||
return end()-3; // don't allocate R0, R1, LR
|
||||
@ -331,7 +331,8 @@ def G8RC : RegisterClass<"PPC", [i64], 64,
|
||||
}
|
||||
G8RCClass::iterator
|
||||
G8RCClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
if (needsFP(MF))
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return end()-5;
|
||||
else
|
||||
return end()-4;
|
||||
|
@ -32,6 +32,8 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const { return false; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -52,10 +52,6 @@ BitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
bool SparcRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
void SparcRegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
|
@ -34,8 +34,6 @@ struct SparcRegisterInfo : public SparcGenRegisterInfo {
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -27,6 +27,15 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
|
||||
/// needsFP - Return true if the specified function should have a dedicated
|
||||
/// frame pointer register. This is true if the function has variable sized
|
||||
/// allocas or if frame pointer elimination is disabled.
|
||||
bool SystemZFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
/// emitSPUpdate - Emit a series of instructions to increment / decrement the
|
||||
/// stack pointer by a constant value.
|
||||
static
|
||||
@ -61,8 +70,6 @@ void SystemZFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
|
||||
const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const SystemZRegisterInfo *RegInfo =
|
||||
static_cast<const SystemZRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const SystemZInstrInfo &TII =
|
||||
*static_cast<const SystemZInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
SystemZMachineFunctionInfo *SystemZMFI =
|
||||
@ -94,7 +101,7 @@ void SystemZFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
emitSPUpdate(MBB, MBBI, -(int64_t)NumBytes, TII);
|
||||
}
|
||||
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// Update R11 with the new base value...
|
||||
BuildMI(MBB, MBBI, DL, TII.get(SystemZ::MOV64rr), SystemZ::R11D)
|
||||
.addReg(SystemZ::R15D);
|
||||
|
@ -34,6 +34,9 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const { return true; }
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -377,8 +377,8 @@ SystemZTargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
DebugLoc dl, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals) const {
|
||||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
|
||||
// Offset to first argument stack slot.
|
||||
const unsigned FirstArgOffset = 160;
|
||||
@ -431,7 +431,7 @@ SystemZTargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
if (StackPtr.getNode() == 0)
|
||||
StackPtr =
|
||||
DAG.getCopyFromReg(Chain, dl,
|
||||
(RegInfo->hasFP(MF) ?
|
||||
(TFI->hasFP(MF) ?
|
||||
SystemZ::R11D : SystemZ::R15D),
|
||||
getPointerTy());
|
||||
|
||||
|
@ -297,7 +297,7 @@ SystemZInstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
if (MI != MBB.end()) DL = MI->getDebugLoc();
|
||||
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const TargetRegisterInfo *RegInfo= MF.getTarget().getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
SystemZMachineFunctionInfo *MFI = MF.getInfo<SystemZMachineFunctionInfo>();
|
||||
|
||||
// Restore FP registers
|
||||
@ -323,7 +323,7 @@ SystemZInstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
if (LowReg != HighReg)
|
||||
MIB.addReg(HighReg, RegState::Define);
|
||||
|
||||
MIB.addReg((RegInfo->hasFP(MF) ? SystemZ::R11D : SystemZ::R15D));
|
||||
MIB.addReg(TFI->hasFP(MF) ? SystemZ::R11D : SystemZ::R15D);
|
||||
MIB.addImm(StartOffset);
|
||||
if (LowReg == HighReg)
|
||||
MIB.addReg(0);
|
||||
|
@ -49,21 +49,15 @@ SystemZRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector SystemZRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
if (hasFP(MF))
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (TFI->hasFP(MF))
|
||||
Reserved.set(SystemZ::R11D);
|
||||
Reserved.set(SystemZ::R14D);
|
||||
Reserved.set(SystemZ::R15D);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
/// needsFP - Return true if the specified function should have a dedicated
|
||||
/// frame pointer register. This is true if the function has variable sized
|
||||
/// allocas or if frame pointer elimination is disabled.
|
||||
bool SystemZRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void SystemZRegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
@ -100,6 +94,8 @@ SystemZRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
unsigned i = 0;
|
||||
MachineInstr &MI = *II;
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
while (!MI.getOperand(i).isFI()) {
|
||||
++i;
|
||||
assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
|
||||
@ -107,7 +103,7 @@ SystemZRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
|
||||
int FrameIndex = MI.getOperand(i).getIndex();
|
||||
|
||||
unsigned BasePtr = (hasFP(MF) ? SystemZ::R11D : SystemZ::R15D);
|
||||
unsigned BasePtr = (TFI->hasFP(MF) ? SystemZ::R11D : SystemZ::R15D);
|
||||
|
||||
// This must be part of a rri or ri operand memory reference. Replace the
|
||||
// FrameIndex with base register with BasePtr. Add an offset to the
|
||||
|
@ -34,9 +34,6 @@ struct SystemZRegisterInfo : public SystemZGenRegisterInfo {
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const { return true; }
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
@ -190,8 +190,8 @@ def GR32 : RegisterClass<"SystemZ", [i32], 32,
|
||||
GR32Class::iterator
|
||||
GR32Class::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG32_nofp;
|
||||
else
|
||||
return SystemZ_REG32;
|
||||
@ -199,8 +199,8 @@ def GR32 : RegisterClass<"SystemZ", [i32], 32,
|
||||
GR32Class::iterator
|
||||
GR32Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG32_nofp + (sizeof(SystemZ_REG32_nofp) / sizeof(unsigned));
|
||||
else
|
||||
return SystemZ_REG32 + (sizeof(SystemZ_REG32) / sizeof(unsigned));
|
||||
@ -237,8 +237,8 @@ def ADDR32 : RegisterClass<"SystemZ", [i32], 32,
|
||||
ADDR32Class::iterator
|
||||
ADDR32Class::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_ADDR32_nofp;
|
||||
else
|
||||
return SystemZ_ADDR32;
|
||||
@ -246,8 +246,8 @@ def ADDR32 : RegisterClass<"SystemZ", [i32], 32,
|
||||
ADDR32Class::iterator
|
||||
ADDR32Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_ADDR32_nofp + (sizeof(SystemZ_ADDR32_nofp) / sizeof(unsigned));
|
||||
else
|
||||
return SystemZ_ADDR32 + (sizeof(SystemZ_ADDR32) / sizeof(unsigned));
|
||||
@ -284,8 +284,8 @@ def GR64 : RegisterClass<"SystemZ", [i64], 64,
|
||||
GR64Class::iterator
|
||||
GR64Class::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG64_nofp;
|
||||
else
|
||||
return SystemZ_REG64;
|
||||
@ -293,8 +293,8 @@ def GR64 : RegisterClass<"SystemZ", [i64], 64,
|
||||
GR64Class::iterator
|
||||
GR64Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG64_nofp + (sizeof(SystemZ_REG64_nofp) / sizeof(unsigned));
|
||||
else
|
||||
return SystemZ_REG64 + (sizeof(SystemZ_REG64) / sizeof(unsigned));
|
||||
@ -331,8 +331,8 @@ def ADDR64 : RegisterClass<"SystemZ", [i64], 64,
|
||||
ADDR64Class::iterator
|
||||
ADDR64Class::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_ADDR64_nofp;
|
||||
else
|
||||
return SystemZ_ADDR64;
|
||||
@ -340,8 +340,8 @@ def ADDR64 : RegisterClass<"SystemZ", [i64], 64,
|
||||
ADDR64Class::iterator
|
||||
ADDR64Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_ADDR64_nofp + (sizeof(SystemZ_ADDR64_nofp) / sizeof(unsigned));
|
||||
else
|
||||
return SystemZ_ADDR64 + (sizeof(SystemZ_ADDR64) / sizeof(unsigned));
|
||||
@ -368,8 +368,8 @@ def GR64P : RegisterClass<"SystemZ", [v2i32], 64,
|
||||
GR64PClass::iterator
|
||||
GR64PClass::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG64P_nofp;
|
||||
else
|
||||
return SystemZ_REG64P;
|
||||
@ -377,8 +377,8 @@ def GR64P : RegisterClass<"SystemZ", [v2i32], 64,
|
||||
GR64PClass::iterator
|
||||
GR64PClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG64P_nofp + (sizeof(SystemZ_REG64P_nofp) / sizeof(unsigned));
|
||||
else
|
||||
return SystemZ_REG64P + (sizeof(SystemZ_REG64P) / sizeof(unsigned));
|
||||
@ -405,8 +405,8 @@ def GR128 : RegisterClass<"SystemZ", [v2i64], 128,
|
||||
GR128Class::iterator
|
||||
GR128Class::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG128_nofp;
|
||||
else
|
||||
return SystemZ_REG128;
|
||||
@ -414,8 +414,8 @@ def GR128 : RegisterClass<"SystemZ", [v2i64], 128,
|
||||
GR128Class::iterator
|
||||
GR128Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return SystemZ_REG128_nofp + (sizeof(SystemZ_REG128_nofp) / sizeof(unsigned));
|
||||
else
|
||||
return SystemZ_REG128 + (sizeof(SystemZ_REG128) / sizeof(unsigned));
|
||||
|
@ -30,6 +30,26 @@ using namespace llvm;
|
||||
// FIXME: completely move here.
|
||||
extern cl::opt<bool> ForceStackAlign;
|
||||
|
||||
bool X86FrameInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
bool X86FrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const MachineModuleInfo &MMI = MF.getMMI();
|
||||
const TargetRegisterInfo *RI = MF.getTarget().getRegisterInfo();
|
||||
|
||||
return (DisableFramePointerElim(MF) ||
|
||||
RI->needsStackRealignment(MF) ||
|
||||
MFI->hasVarSizedObjects() ||
|
||||
MFI->isFrameAddressTaken() ||
|
||||
MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() ||
|
||||
MMI.callsUnwindInit());
|
||||
}
|
||||
|
||||
static unsigned getSUBriOpcode(unsigned is64Bit, int64_t Imm) {
|
||||
if (is64Bit) {
|
||||
if (isInt<8>(Imm))
|
||||
@ -184,8 +204,6 @@ void X86FrameInfo::emitCalleeSavedFrameMoves(MachineFunction &MF,
|
||||
MCSymbol *Label,
|
||||
unsigned FramePtr) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const X86RegisterInfo *RegInfo =
|
||||
static_cast<const X86RegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
MachineModuleInfo &MMI = MF.getMMI();
|
||||
|
||||
// Add callee saved registers to move list.
|
||||
@ -194,7 +212,7 @@ void X86FrameInfo::emitCalleeSavedFrameMoves(MachineFunction &MF,
|
||||
|
||||
std::vector<MachineMove> &Moves = MMI.getFrameMoves();
|
||||
const TargetData *TD = MF.getTarget().getTargetData();
|
||||
bool HasFP = RegInfo->hasFP(MF);
|
||||
bool HasFP = hasFP(MF);
|
||||
|
||||
// Calculate amount of bytes used for return address storing.
|
||||
int stackGrowth =
|
||||
@ -269,7 +287,7 @@ void X86FrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
!Fn->doesNotThrow() || UnwindTablesMandatory;
|
||||
uint64_t MaxAlign = MFI->getMaxAlignment(); // Desired stack alignment.
|
||||
uint64_t StackSize = MFI->getStackSize(); // Number of bytes to allocate.
|
||||
bool HasFP = RegInfo->hasFP(MF);
|
||||
bool HasFP = hasFP(MF);
|
||||
bool Is64Bit = STI.is64Bit();
|
||||
bool IsWin64 = STI.isTargetWin64();
|
||||
unsigned StackAlign = getStackAlignment();
|
||||
@ -596,7 +614,7 @@ void X86FrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MaxAlign = MaxAlign ? MaxAlign : 4;
|
||||
}
|
||||
|
||||
if (RegInfo->hasFP(MF)) {
|
||||
if (hasFP(MF)) {
|
||||
// Calculate required stack adjustment.
|
||||
uint64_t FrameSize = StackSize - SlotSize;
|
||||
if (RegInfo->needsStackRealignment(MF))
|
||||
|
@ -39,6 +39,10 @@ public:
|
||||
/// the function.
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -1172,7 +1172,9 @@ X86TargetLowering::findRepresentativeClass(EVT VT) const{
|
||||
unsigned
|
||||
X86TargetLowering::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
unsigned FPDiff = RegInfo->hasFP(MF) ? 1 : 0;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
unsigned FPDiff = TFI->hasFP(MF) ? 1 : 0;
|
||||
switch (RC->getID()) {
|
||||
default:
|
||||
return 0;
|
||||
|
@ -388,6 +388,8 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
// Set the stack-pointer register and its aliases as reserved.
|
||||
Reserved.set(X86::RSP);
|
||||
Reserved.set(X86::ESP);
|
||||
@ -400,7 +402,7 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
Reserved.set(X86::IP);
|
||||
|
||||
// Set the frame-pointer register and its aliases as reserved if needed.
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
Reserved.set(X86::RBP);
|
||||
Reserved.set(X86::EBP);
|
||||
Reserved.set(X86::BP);
|
||||
@ -425,21 +427,6 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const MachineModuleInfo &MMI = MF.getMMI();
|
||||
|
||||
return (DisableFramePointerElim(MF) ||
|
||||
needsStackRealignment(MF) ||
|
||||
MFI->hasVarSizedObjects() ||
|
||||
MFI->isFrameAddressTaken() ||
|
||||
MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() ||
|
||||
MMI.callsUnwindInit());
|
||||
}
|
||||
|
||||
bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return (RealignStack &&
|
||||
@ -466,13 +453,11 @@ bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
||||
return requiresRealignment && canRealignStack(MF);
|
||||
}
|
||||
|
||||
bool X86RegisterInfo::hasReservedCallFrame(const MachineFunction &MF) const {
|
||||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
bool X86RegisterInfo::hasReservedSpillSlot(const MachineFunction &MF,
|
||||
unsigned Reg, int &FrameIdx) const {
|
||||
if (Reg == FramePtr && hasFP(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (Reg == FramePtr && TFI->hasFP(MF)) {
|
||||
FrameIdx = MF.getFrameInfo()->getObjectIndexBegin();
|
||||
return true;
|
||||
}
|
||||
@ -481,9 +466,9 @@ bool X86RegisterInfo::hasReservedSpillSlot(const MachineFunction &MF,
|
||||
|
||||
int
|
||||
X86RegisterInfo::getFrameIndexOffset(const MachineFunction &MF, int FI) const {
|
||||
const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
int Offset = MFI->getObjectOffset(FI) - TFI.getOffsetOfLocalArea();
|
||||
int Offset = MFI->getObjectOffset(FI) - TFI->getOffsetOfLocalArea();
|
||||
uint64_t StackSize = MFI->getStackSize();
|
||||
|
||||
if (needsStackRealignment(MF)) {
|
||||
@ -498,7 +483,7 @@ X86RegisterInfo::getFrameIndexOffset(const MachineFunction &MF, int FI) const {
|
||||
}
|
||||
// FIXME: Support tail calls
|
||||
} else {
|
||||
if (!hasFP(MF))
|
||||
if (!TFI->hasFP(MF))
|
||||
return Offset + StackSize;
|
||||
|
||||
// Skip the saved EBP.
|
||||
@ -541,7 +526,9 @@ static unsigned getADDriOpcode(unsigned is64Bit, int64_t Imm) {
|
||||
void X86RegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (!TFI->hasReservedCallFrame(MF)) {
|
||||
// If the stack pointer can be changed after prologue, turn the
|
||||
// adjcallstackup instruction into a 'sub ESP, <amt>' and the
|
||||
// adjcallstackdown instruction into 'add ESP, <amt>'
|
||||
@ -614,6 +601,7 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
unsigned i = 0;
|
||||
MachineInstr &MI = *II;
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
while (!MI.getOperand(i).isFI()) {
|
||||
++i;
|
||||
@ -630,7 +618,7 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
else if (AfterFPPop)
|
||||
BasePtr = StackPtr;
|
||||
else
|
||||
BasePtr = (hasFP(MF) ? FramePtr : StackPtr);
|
||||
BasePtr = (TFI->hasFP(MF) ? FramePtr : StackPtr);
|
||||
|
||||
// This must be part of a four operand memory reference. Replace the
|
||||
// FrameIndex with base register with EBP. Add an offset to the offset.
|
||||
@ -640,9 +628,8 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
int FIOffset;
|
||||
if (AfterFPPop) {
|
||||
// Tail call jmp happens after FP is popped.
|
||||
const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
FIOffset = MFI->getObjectOffset(FrameIndex) - TFI.getOffsetOfLocalArea();
|
||||
FIOffset = MFI->getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea();
|
||||
} else
|
||||
FIOffset = getFrameIndexOffset(MF, FrameIndex);
|
||||
|
||||
@ -661,6 +648,7 @@ void
|
||||
X86RegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
RegScavenger *RS) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
int32_t TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
|
||||
@ -679,7 +667,7 @@ X86RegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
(-1U*SlotSize)+TailCallReturnAddrDelta, true);
|
||||
}
|
||||
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
assert((TailCallReturnAddrDelta <= 0) &&
|
||||
"The Delta should always be zero or negative");
|
||||
const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
|
||||
@ -702,7 +690,8 @@ unsigned X86RegisterInfo::getRARegister() const {
|
||||
}
|
||||
|
||||
unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
return hasFP(MF) ? FramePtr : StackPtr;
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
return TFI->hasFP(MF) ? FramePtr : StackPtr;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -111,14 +111,10 @@ public:
|
||||
/// register scavenger to determine what registers are free.
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
bool canRealignStack(const MachineFunction &MF) const;
|
||||
|
||||
bool needsStackRealignment(const MachineFunction &MF) const;
|
||||
|
||||
bool hasReservedCallFrame(const MachineFunction &MF) const;
|
||||
|
||||
bool hasReservedSpillSlot(const MachineFunction &MF, unsigned Reg,
|
||||
int &FrameIdx) const;
|
||||
|
||||
|
@ -299,14 +299,14 @@ def GR8 : RegisterClass<"X86", [i8], 8,
|
||||
GR8Class::iterator
|
||||
GR8Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
// Does the function dedicate RBP / EBP to being a frame ptr?
|
||||
if (!Subtarget.is64Bit())
|
||||
// In 32-mode, none of the 8-bit registers aliases EBP or ESP.
|
||||
return begin() + 8;
|
||||
else if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
else if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate SPL or BPL.
|
||||
return array_endof(X86_GR8_AO_64) - 1;
|
||||
else
|
||||
@ -344,12 +344,12 @@ def GR16 : RegisterClass<"X86", [i16], 16,
|
||||
GR16Class::iterator
|
||||
GR16Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
if (Subtarget.is64Bit()) {
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate SP or BP.
|
||||
return array_endof(X86_GR16_AO_64) - 1;
|
||||
else
|
||||
@ -357,7 +357,7 @@ def GR16 : RegisterClass<"X86", [i16], 16,
|
||||
return array_endof(X86_GR16_AO_64);
|
||||
} else {
|
||||
// Does the function dedicate EBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate SP or BP.
|
||||
return begin() + 6;
|
||||
else
|
||||
@ -396,12 +396,12 @@ def GR32 : RegisterClass<"X86", [i32], 32,
|
||||
GR32Class::iterator
|
||||
GR32Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
if (Subtarget.is64Bit()) {
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate ESP or EBP.
|
||||
return array_endof(X86_GR32_AO_64) - 1;
|
||||
else
|
||||
@ -409,7 +409,7 @@ def GR32 : RegisterClass<"X86", [i32], 32,
|
||||
return array_endof(X86_GR32_AO_64);
|
||||
} else {
|
||||
// Does the function dedicate EBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate ESP or EBP.
|
||||
return begin() + 6;
|
||||
else
|
||||
@ -436,13 +436,13 @@ def GR64 : RegisterClass<"X86", [i64], 64,
|
||||
GR64Class::iterator
|
||||
GR64Class::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
if (!Subtarget.is64Bit())
|
||||
return begin(); // None of these are allocatable in 32-bit.
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
return end()-3; // If so, don't allocate RIP, RSP or RBP
|
||||
else
|
||||
return end()-2; // If not, just don't allocate RIP or RSP
|
||||
@ -541,10 +541,10 @@ def GR16_NOREX : RegisterClass<"X86", [i16], 16,
|
||||
GR16_NOREXClass::iterator
|
||||
GR16_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
// Does the function dedicate RBP / EBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate SP or BP.
|
||||
return end() - 2;
|
||||
else
|
||||
@ -565,10 +565,10 @@ def GR32_NOREX : RegisterClass<"X86", [i32], 32,
|
||||
GR32_NOREXClass::iterator
|
||||
GR32_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
// Does the function dedicate RBP / EBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate ESP or EBP.
|
||||
return end() - 2;
|
||||
else
|
||||
@ -590,10 +590,10 @@ def GR64_NOREX : RegisterClass<"X86", [i64], 64,
|
||||
GR64_NOREXClass::iterator
|
||||
GR64_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate RIP, RSP or RBP.
|
||||
return end() - 3;
|
||||
else
|
||||
@ -632,12 +632,12 @@ def GR32_NOSP : RegisterClass<"X86", [i32], 32,
|
||||
GR32_NOSPClass::iterator
|
||||
GR32_NOSPClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
if (Subtarget.is64Bit()) {
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate EBP.
|
||||
return array_endof(X86_GR32_NOSP_AO_64) - 1;
|
||||
else
|
||||
@ -645,7 +645,7 @@ def GR32_NOSP : RegisterClass<"X86", [i32], 32,
|
||||
return array_endof(X86_GR32_NOSP_AO_64);
|
||||
} else {
|
||||
// Does the function dedicate EBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate EBP.
|
||||
return begin() + 6;
|
||||
else
|
||||
@ -670,13 +670,13 @@ def GR64_NOSP : RegisterClass<"X86", [i64], 64,
|
||||
GR64_NOSPClass::iterator
|
||||
GR64_NOSPClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
if (!Subtarget.is64Bit())
|
||||
return begin(); // None of these are allocatable in 32-bit.
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
return end()-1; // If so, don't allocate RBP
|
||||
else
|
||||
return end(); // If not, any reg in this class is ok.
|
||||
@ -698,10 +698,10 @@ def GR64_NOREX_NOSP : RegisterClass<"X86", [i64], 64,
|
||||
GR64_NOREX_NOSPClass::allocation_order_end(const MachineFunction &MF) const
|
||||
{
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
// Does the function dedicate RBP to being a frame ptr?
|
||||
if (RI->hasFP(MF) || MFI->getReserveFP())
|
||||
if (TFI->hasFP(MF) || MFI->getReserveFP())
|
||||
// If so, don't allocate RBP.
|
||||
return end() - 1;
|
||||
else
|
||||
|
@ -82,6 +82,10 @@ XCoreFrameInfo::XCoreFrameInfo(const XCoreSubtarget &sti)
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
bool XCoreFrameInfo::hasFP(const MachineFunction &MF) const {
|
||||
return DisableFramePointerElim(MF) || MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
void XCoreFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
@ -94,7 +98,7 @@ void XCoreFrameInfo::emitPrologue(MachineFunction &MF) const {
|
||||
XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>();
|
||||
DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
|
||||
|
||||
bool FP = RegInfo->hasFP(MF);
|
||||
bool FP = hasFP(MF);
|
||||
|
||||
// Work out frame sizes.
|
||||
int FrameSize = MFI->getStackSize();
|
||||
@ -204,14 +208,11 @@ void XCoreFrameInfo::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MachineBasicBlock::iterator MBBI = prior(MBB.end());
|
||||
const XCoreRegisterInfo *RegInfo =
|
||||
static_cast<const XCoreRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
const XCoreInstrInfo &TII =
|
||||
*static_cast<const XCoreInstrInfo*>(MF.getTarget().getInstrInfo());
|
||||
DebugLoc dl = MBBI->getDebugLoc();
|
||||
|
||||
bool FP = RegInfo->hasFP(MF);
|
||||
|
||||
bool FP = hasFP(MF);
|
||||
if (FP) {
|
||||
// Restore the stack pointer.
|
||||
unsigned FramePtr = XCore::R10;
|
||||
|
@ -31,6 +31,8 @@ namespace llvm {
|
||||
void emitPrologue(MachineFunction &MF) const;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
//! Stack slot size (4 bytes)
|
||||
static int stackSlotSize() {
|
||||
return 4;
|
||||
|
@ -84,11 +84,13 @@ const unsigned* XCoreRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
|
||||
|
||||
BitVector XCoreRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
Reserved.set(XCore::CP);
|
||||
Reserved.set(XCore::DP);
|
||||
Reserved.set(XCore::SP);
|
||||
Reserved.set(XCore::LR);
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
Reserved.set(XCore::R10);
|
||||
}
|
||||
return Reserved;
|
||||
@ -96,12 +98,10 @@ BitVector XCoreRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
|
||||
bool
|
||||
XCoreRegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
|
||||
// TODO can we estimate stack size?
|
||||
return hasFP(MF);
|
||||
}
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
bool XCoreRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
return DisableFramePointerElim(MF) || MF.getFrameInfo()->hasVarSizedObjects();
|
||||
// TODO can we estimate stack size?
|
||||
return TFI->hasFP(MF);
|
||||
}
|
||||
|
||||
// This function eliminates ADJCALLSTACKDOWN,
|
||||
@ -109,7 +109,9 @@ bool XCoreRegisterInfo::hasFP(const MachineFunction &MF) const {
|
||||
void XCoreRegisterInfo::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
if (!TFI->hasReservedCallFrame(MF)) {
|
||||
// Turn the adjcallstackdown instruction into 'extsp <amt>' and the
|
||||
// adjcallstackup instruction into 'ldaw sp, sp[<amt>]'
|
||||
MachineInstr *Old = I;
|
||||
@ -172,6 +174,7 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
int FrameIndex = FrameOp.getIndex();
|
||||
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
|
||||
int StackSize = MF.getFrameInfo()->getStackSize();
|
||||
|
||||
@ -197,7 +200,7 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
|
||||
Offset/=4;
|
||||
|
||||
bool FP = hasFP(MF);
|
||||
bool FP = TFI->hasFP(MF);
|
||||
|
||||
unsigned Reg = MI.getOperand(0).getReg();
|
||||
bool isKill = MI.getOpcode() == XCore::STWFI && MI.getOperand(0).isKill();
|
||||
@ -296,6 +299,7 @@ void
|
||||
XCoreRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
RegScavenger *RS) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
bool LRUsed = MF.getRegInfo().isPhysRegUsed(XCore::LR);
|
||||
const TargetRegisterClass *RC = XCore::GRRegsRegisterClass;
|
||||
XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>();
|
||||
@ -320,7 +324,7 @@ XCoreRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
RC->getAlignment(),
|
||||
false));
|
||||
}
|
||||
if (hasFP(MF)) {
|
||||
if (TFI->hasFP(MF)) {
|
||||
// A callee save register is used to hold the FP.
|
||||
// This needs saving / restoring in the epilogue / prologue.
|
||||
XFI->setFPSpillSlot(MFI->CreateStackObject(RC->getSize(),
|
||||
@ -351,9 +355,9 @@ int XCoreRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
|
||||
}
|
||||
|
||||
unsigned XCoreRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
bool FP = hasFP(MF);
|
||||
const TargetFrameInfo *TFI = MF.getTarget().getFrameInfo();
|
||||
|
||||
return FP ? XCore::R10 : XCore::SP;
|
||||
return TFI->hasFP(MF) ? XCore::R10 : XCore::SP;
|
||||
}
|
||||
|
||||
unsigned XCoreRegisterInfo::getRARegister() const {
|
||||
|
@ -48,8 +48,6 @@ public:
|
||||
|
||||
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const;
|
||||
|
@ -61,8 +61,8 @@ def GRRegs : RegisterClass<"XCore", [i32], 32,
|
||||
GRRegsClass::iterator
|
||||
GRRegsClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
if (RI->hasFP(MF))
|
||||
const TargetFrameInfo *TFI = TM.getFrameInfo();
|
||||
if (TFI->hasFP(MF))
|
||||
return end()-1; // don't allocate R10
|
||||
else
|
||||
return end();
|
||||
|
Loading…
Reference in New Issue
Block a user