diff options
| author | Anton Korobeynikov <asl@math.spbu.ru> | 2010-11-18 21:19:35 +0000 | 
|---|---|---|
| committer | Anton Korobeynikov <asl@math.spbu.ru> | 2010-11-18 21:19:35 +0000 | 
| commit | d0c38176690e9602a93a20a43f1bd084564a8116 (patch) | |
| tree | d4c7a39ff5665d4adb34f193c2256f1c6d033181 /lib | |
| parent | b9064bb96458ab48a878e1a7e678cada2e22ab7a (diff) | |
| download | external_llvm-d0c38176690e9602a93a20a43f1bd084564a8116.zip external_llvm-d0c38176690e9602a93a20a43f1bd084564a8116.tar.gz external_llvm-d0c38176690e9602a93a20a43f1bd084564a8116.tar.bz2  | |
Move hasFP() and few related hooks to TargetFrameInfo.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119740 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
66 files changed, 466 insertions, 436 deletions
diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp index a1108da..f712a77 100644 --- a/lib/CodeGen/PrologEpilogInserter.cpp +++ b/lib/CodeGen/PrologEpilogInserter.cpp @@ -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 diff --git a/lib/Target/ARM/ARMBaseRegisterInfo.cpp b/lib/Target/ARM/ARMBaseRegisterInfo.cpp index 6ecd817..7bba4d6 100644 --- a/lib/Target/ARM/ARMBaseRegisterInfo.cpp +++ b/lib/Target/ARM/ARMBaseRegisterInfo.cpp @@ -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; diff --git a/lib/Target/ARM/ARMBaseRegisterInfo.h b/lib/Target/ARM/ARMBaseRegisterInfo.h index 5cb0808..ccbd882 100644 --- a/lib/Target/ARM/ARMBaseRegisterInfo.h +++ b/lib/Target/ARM/ARMBaseRegisterInfo.h @@ -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; diff --git a/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/lib/Target/ARM/ARMExpandPseudoInsts.cpp index a6fbe72..22ec737 100644 --- a/lib/Target/ARM/ARMExpandPseudoInsts.cpp +++ b/lib/Target/ARM/ARMExpandPseudoInsts.cpp @@ -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, diff --git a/lib/Target/ARM/ARMFrameInfo.cpp b/lib/Target/ARM/ARMFrameInfo.cpp index 3417ae2..fa11096 100644 --- a/lib/Target/ARM/ARMFrameInfo.cpp +++ b/lib/Target/ARM/ARMFrameInfo.cpp @@ -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); diff --git a/lib/Target/ARM/ARMFrameInfo.h b/lib/Target/ARM/ARMFrameInfo.h index 9ea97e8..5a0e890 100644 --- a/lib/Target/ARM/ARMFrameInfo.h +++ b/lib/Target/ARM/ARMFrameInfo.h @@ -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 diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index ff429c7..299009b 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -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. diff --git a/lib/Target/ARM/Thumb1FrameInfo.cpp b/lib/Target/ARM/Thumb1FrameInfo.cpp index cc8d0ab..6a3c1e1 100644 --- a/lib/Target/ARM/Thumb1FrameInfo.cpp +++ b/lib/Target/ARM/Thumb1FrameInfo.cpp @@ -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()); diff --git a/lib/Target/ARM/Thumb1FrameInfo.h b/lib/Target/ARM/Thumb1FrameInfo.h index 36be446..f2ecaf1 100644 --- a/lib/Target/ARM/Thumb1FrameInfo.h +++ b/lib/Target/ARM/Thumb1FrameInfo.h @@ -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 diff --git a/lib/Target/ARM/Thumb1RegisterInfo.cpp b/lib/Target/ARM/Thumb1RegisterInfo.cpp index 8b4f018..7b501df 100644 --- a/lib/Target/ARM/Thumb1RegisterInfo.cpp +++ b/lib/Target/ARM/Thumb1RegisterInfo.cpp @@ -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)) { diff --git a/lib/Target/ARM/Thumb1RegisterInfo.h b/lib/Target/ARM/Thumb1RegisterInfo.h index 45a7926..8a87cc5 100644 --- a/lib/Target/ARM/Thumb1RegisterInfo.h +++ b/lib/Target/ARM/Thumb1RegisterInfo.h @@ -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; diff --git a/lib/Target/Alpha/AlphaFrameInfo.cpp b/lib/Target/Alpha/AlphaFrameInfo.cpp index 601e5db..0b25b48 100644 --- a/lib/Target/Alpha/AlphaFrameInfo.cpp +++ b/lib/Target/Alpha/AlphaFrameInfo.cpp @@ -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(); diff --git a/lib/Target/Alpha/AlphaFrameInfo.h b/lib/Target/Alpha/AlphaFrameInfo.h index df23523..2f822e5 100644 --- a/lib/Target/Alpha/AlphaFrameInfo.h +++ b/lib/Target/Alpha/AlphaFrameInfo.h @@ -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 diff --git a/lib/Target/Alpha/AlphaRegisterInfo.cpp b/lib/Target/Alpha/AlphaRegisterInfo.cpp index 001922d..fd3b25d 100644 --- a/lib/Target/Alpha/AlphaRegisterInfo.cpp +++ b/lib/Target/Alpha/AlphaRegisterInfo.cpp @@ -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 { diff --git a/lib/Target/Alpha/AlphaRegisterInfo.h b/lib/Target/Alpha/AlphaRegisterInfo.h index 9ff4175..b0d4dd0 100644 --- a/lib/Target/Alpha/AlphaRegisterInfo.h +++ b/lib/Target/Alpha/AlphaRegisterInfo.h @@ -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; diff --git a/lib/Target/Blackfin/BlackfinFrameInfo.cpp b/lib/Target/Blackfin/BlackfinFrameInfo.cpp index 83f28b0..4f9054b 100644 --- a/lib/Target/Blackfin/BlackfinFrameInfo.cpp +++ b/lib/Target/Blackfin/BlackfinFrameInfo.cpp @@ -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); diff --git a/lib/Target/Blackfin/BlackfinFrameInfo.h b/lib/Target/Blackfin/BlackfinFrameInfo.h index ff8ba2d..3b53f34 100644 --- a/lib/Target/Blackfin/BlackfinFrameInfo.h +++ b/lib/Target/Blackfin/BlackfinFrameInfo.h @@ -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 diff --git a/lib/Target/Blackfin/BlackfinRegisterInfo.cpp b/lib/Target/Blackfin/BlackfinRegisterInfo.cpp index 4f827b7..23df625 100644 --- a/lib/Target/Blackfin/BlackfinRegisterInfo.cpp +++ b/lib/Target/Blackfin/BlackfinRegisterInfo.cpp @@ -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 { diff --git a/lib/Target/Blackfin/BlackfinRegisterInfo.h b/lib/Target/Blackfin/BlackfinRegisterInfo.h index be08292..0c47d25 100644 --- a/lib/Target/Blackfin/BlackfinRegisterInfo.h +++ b/lib/Target/Blackfin/BlackfinRegisterInfo.h @@ -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; diff --git a/lib/Target/Blackfin/BlackfinRegisterInfo.td b/lib/Target/Blackfin/BlackfinRegisterInfo.td index e1cfae9..f34e19c 100644 --- a/lib/Target/Blackfin/BlackfinRegisterInfo.td +++ b/lib/Target/Blackfin/BlackfinRegisterInfo.td @@ -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);      }    }];  } diff --git a/lib/Target/CellSPU/SPUFrameInfo.cpp b/lib/Target/CellSPU/SPUFrameInfo.cpp index 70ee8b8..b1a09ad 100644 --- a/lib/Target/CellSPU/SPUFrameInfo.cpp +++ b/lib/Target/CellSPU/SPUFrameInfo.cpp @@ -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 { diff --git a/lib/Target/CellSPU/SPUFrameInfo.h b/lib/Target/CellSPU/SPUFrameInfo.h index 89ce1e9..a705a9f 100644 --- a/lib/Target/CellSPU/SPUFrameInfo.h +++ b/lib/Target/CellSPU/SPUFrameInfo.h @@ -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. diff --git a/lib/Target/CellSPU/SPURegisterInfo.cpp b/lib/Target/CellSPU/SPURegisterInfo.cpp index 0928a9c..f399437 100644 --- a/lib/Target/CellSPU/SPURegisterInfo.cpp +++ b/lib/Target/CellSPU/SPURegisterInfo.cpp @@ -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, diff --git a/lib/Target/CellSPU/SPURegisterInfo.h b/lib/Target/CellSPU/SPURegisterInfo.h index 088157e..70eeaf9 100644 --- a/lib/Target/CellSPU/SPURegisterInfo.h +++ b/lib/Target/CellSPU/SPURegisterInfo.h @@ -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, diff --git a/lib/Target/MBlaze/MBlazeFrameInfo.cpp b/lib/Target/MBlaze/MBlazeFrameInfo.cpp index c1209a4..09f8e43 100644 --- a/lib/Target/MBlaze/MBlazeFrameInfo.cpp +++ b/lib/Target/MBlaze/MBlazeFrameInfo.cpp @@ -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); diff --git a/lib/Target/MBlaze/MBlazeFrameInfo.h b/lib/Target/MBlaze/MBlazeFrameInfo.h index 3e96ee3..204d2f8 100644 --- a/lib/Target/MBlaze/MBlazeFrameInfo.h +++ b/lib/Target/MBlaze/MBlazeFrameInfo.h @@ -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 diff --git a/lib/Target/MBlaze/MBlazeRegisterInfo.cpp b/lib/Target/MBlaze/MBlazeRegisterInfo.cpp index 37a30c7..f74eea7 100644 --- a/lib/Target/MBlaze/MBlazeRegisterInfo.cpp +++ b/lib/Target/MBlaze/MBlazeRegisterInfo.cpp @@ -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 { diff --git a/lib/Target/MBlaze/MBlazeRegisterInfo.h b/lib/Target/MBlaze/MBlazeRegisterInfo.h index 356a11f..ac1635b 100644 --- a/lib/Target/MBlaze/MBlazeRegisterInfo.h +++ b/lib/Target/MBlaze/MBlazeRegisterInfo.h @@ -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; diff --git a/lib/Target/MSP430/MSP430FrameInfo.cpp b/lib/Target/MSP430/MSP430FrameInfo.cpp index 42a44a7..0a39a36 100644 --- a/lib/Target/MSP430/MSP430FrameInfo.cpp +++ b/lib/Target/MSP430/MSP430FrameInfo.cpp @@ -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; diff --git a/lib/Target/MSP430/MSP430FrameInfo.h b/lib/Target/MSP430/MSP430FrameInfo.h index aa4198f..00bf99d 100644 --- a/lib/Target/MSP430/MSP430FrameInfo.h +++ b/lib/Target/MSP430/MSP430FrameInfo.h @@ -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 diff --git a/lib/Target/MSP430/MSP430RegisterInfo.cpp b/lib/Target/MSP430/MSP430RegisterInfo.cpp index 12acf9c..646375c 100644 --- a/lib/Target/MSP430/MSP430RegisterInfo.cpp +++ b/lib/Target/MSP430/MSP430RegisterInfo.cpp @@ -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 { diff --git a/lib/Target/MSP430/MSP430RegisterInfo.h b/lib/Target/MSP430/MSP430RegisterInfo.h index d0cf2f8..56744fa 100644 --- a/lib/Target/MSP430/MSP430RegisterInfo.h +++ b/lib/Target/MSP430/MSP430RegisterInfo.h @@ -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; diff --git a/lib/Target/MSP430/MSP430RegisterInfo.td b/lib/Target/MSP430/MSP430RegisterInfo.td index f8aec66..cca02e0 100644 --- a/lib/Target/MSP430/MSP430RegisterInfo.td +++ b/lib/Target/MSP430/MSP430RegisterInfo.td @@ -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; diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index 6660f6b..4b46d61 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -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); diff --git a/lib/Target/Mips/MipsFrameInfo.cpp b/lib/Target/Mips/MipsFrameInfo.cpp index 29e8bc5..c062b6b 100644 --- a/lib/Target/Mips/MipsFrameInfo.cpp +++ b/lib/Target/Mips/MipsFrameInfo.cpp @@ -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); diff --git a/lib/Target/Mips/MipsFrameInfo.h b/lib/Target/Mips/MipsFrameInfo.h index 971e653..2cbaa21 100644 --- a/lib/Target/Mips/MipsFrameInfo.h +++ b/lib/Target/Mips/MipsFrameInfo.h @@ -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 diff --git a/lib/Target/Mips/MipsRegisterInfo.cpp b/lib/Target/Mips/MipsRegisterInfo.cpp index fd221c4..3612f36 100644 --- a/lib/Target/Mips/MipsRegisterInfo.cpp +++ b/lib/Target/Mips/MipsRegisterInfo.cpp @@ -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:: diff --git a/lib/Target/Mips/MipsRegisterInfo.h b/lib/Target/Mips/MipsRegisterInfo.h index a3395e3..a7f4bf9 100644 --- a/lib/Target/Mips/MipsRegisterInfo.h +++ b/lib/Target/Mips/MipsRegisterInfo.h @@ -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; diff --git a/lib/Target/PTX/PTXFrameInfo.h b/lib/Target/PTX/PTXFrameInfo.h index 6790120..d11780a 100644 --- a/lib/Target/PTX/PTXFrameInfo.h +++ b/lib/Target/PTX/PTXFrameInfo.h @@ -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 diff --git a/lib/Target/PTX/PTXRegisterInfo.h b/lib/Target/PTX/PTXRegisterInfo.h index 4e5b4b1..67e130f 100644 --- a/lib/Target/PTX/PTXRegisterInfo.h +++ b/lib/Target/PTX/PTXRegisterInfo.h @@ -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 { diff --git a/lib/Target/PowerPC/PPCFrameInfo.cpp b/lib/Target/PowerPC/PPCFrameInfo.cpp index 3823e3f..453975c 100644 --- a/lib/Target/PowerPC/PPCFrameInfo.cpp +++ b/lib/Target/PowerPC/PPCFrameInfo.cpp @@ -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()) { diff --git a/lib/Target/PowerPC/PPCFrameInfo.h b/lib/Target/PowerPC/PPCFrameInfo.h index c04d1f5..aeaa864 100644 --- a/lib/Target/PowerPC/PPCFrameInfo.h +++ b/lib/Target/PowerPC/PPCFrameInfo.h @@ -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). diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index e7293f1..0459c7f 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -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) diff --git a/lib/Target/PowerPC/PPCRegisterInfo.h b/lib/Target/PowerPC/PPCRegisterInfo.h index 3d2aa60..6e72742 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.h +++ b/lib/Target/PowerPC/PPCRegisterInfo.h @@ -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; diff --git a/lib/Target/PowerPC/PPCRegisterInfo.td b/lib/Target/PowerPC/PPCRegisterInfo.td index 8604f54..2fbd41b 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.td +++ b/lib/Target/PowerPC/PPCRegisterInfo.td @@ -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; diff --git a/lib/Target/Sparc/SparcFrameInfo.h b/lib/Target/Sparc/SparcFrameInfo.h index 4a6182a..2ac319a 100644 --- a/lib/Target/Sparc/SparcFrameInfo.h +++ b/lib/Target/Sparc/SparcFrameInfo.h @@ -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 diff --git a/lib/Target/Sparc/SparcRegisterInfo.cpp b/lib/Target/Sparc/SparcRegisterInfo.cpp index b66888c..b010d04 100644 --- a/lib/Target/Sparc/SparcRegisterInfo.cpp +++ b/lib/Target/Sparc/SparcRegisterInfo.cpp @@ -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 { diff --git a/lib/Target/Sparc/SparcRegisterInfo.h b/lib/Target/Sparc/SparcRegisterInfo.h index 9534b93..d930b53 100644 --- a/lib/Target/Sparc/SparcRegisterInfo.h +++ b/lib/Target/Sparc/SparcRegisterInfo.h @@ -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; diff --git a/lib/Target/SystemZ/SystemZFrameInfo.cpp b/lib/Target/SystemZ/SystemZFrameInfo.cpp index 6df0722..9d6e8a8 100644 --- a/lib/Target/SystemZ/SystemZFrameInfo.cpp +++ b/lib/Target/SystemZ/SystemZFrameInfo.cpp @@ -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); diff --git a/lib/Target/SystemZ/SystemZFrameInfo.h b/lib/Target/SystemZ/SystemZFrameInfo.h index 2f97331..a37a253 100644 --- a/lib/Target/SystemZ/SystemZFrameInfo.h +++ b/lib/Target/SystemZ/SystemZFrameInfo.h @@ -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 diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp index 1fc9d81..2cc2ad5 100644 --- a/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -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()); diff --git a/lib/Target/SystemZ/SystemZInstrInfo.cpp b/lib/Target/SystemZ/SystemZInstrInfo.cpp index 367bed3..c145ce0 100644 --- a/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -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); diff --git a/lib/Target/SystemZ/SystemZRegisterInfo.cpp b/lib/Target/SystemZ/SystemZRegisterInfo.cpp index e738d17..9f8555b 100644 --- a/lib/Target/SystemZ/SystemZRegisterInfo.cpp +++ b/lib/Target/SystemZ/SystemZRegisterInfo.cpp @@ -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 diff --git a/lib/Target/SystemZ/SystemZRegisterInfo.h b/lib/Target/SystemZ/SystemZRegisterInfo.h index e376d1b..b731a68 100644 --- a/lib/Target/SystemZ/SystemZRegisterInfo.h +++ b/lib/Target/SystemZ/SystemZRegisterInfo.h @@ -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, diff --git a/lib/Target/SystemZ/SystemZRegisterInfo.td b/lib/Target/SystemZ/SystemZRegisterInfo.td index 33be8dd..4ed9254 100644 --- a/lib/Target/SystemZ/SystemZRegisterInfo.td +++ b/lib/Target/SystemZ/SystemZRegisterInfo.td @@ -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)); diff --git a/lib/Target/X86/X86FrameInfo.cpp b/lib/Target/X86/X86FrameInfo.cpp index 98c579b..affb6ff 100644 --- a/lib/Target/X86/X86FrameInfo.cpp +++ b/lib/Target/X86/X86FrameInfo.cpp @@ -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)) diff --git a/lib/Target/X86/X86FrameInfo.h b/lib/Target/X86/X86FrameInfo.h index 7828e17..433d965 100644 --- a/lib/Target/X86/X86FrameInfo.h +++ b/lib/Target/X86/X86FrameInfo.h @@ -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 diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 6233af5..2ecc6fd 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -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; diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index 0f505d1..5cbbb06 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -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 diff --git a/lib/Target/X86/X86RegisterInfo.h b/lib/Target/X86/X86RegisterInfo.h index 0796191..f543c19 100644 --- a/lib/Target/X86/X86RegisterInfo.h +++ b/lib/Target/X86/X86RegisterInfo.h @@ -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; diff --git a/lib/Target/X86/X86RegisterInfo.td b/lib/Target/X86/X86RegisterInfo.td index 8fc26d7..a5e3fc2 100644 --- a/lib/Target/X86/X86RegisterInfo.td +++ b/lib/Target/X86/X86RegisterInfo.td @@ -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 diff --git a/lib/Target/XCore/XCoreFrameInfo.cpp b/lib/Target/XCore/XCoreFrameInfo.cpp index 0a7f747..ae86c95 100644 --- a/lib/Target/XCore/XCoreFrameInfo.cpp +++ b/lib/Target/XCore/XCoreFrameInfo.cpp @@ -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; diff --git a/lib/Target/XCore/XCoreFrameInfo.h b/lib/Target/XCore/XCoreFrameInfo.h index 47a652d..76960a7 100644 --- a/lib/Target/XCore/XCoreFrameInfo.h +++ b/lib/Target/XCore/XCoreFrameInfo.h @@ -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; diff --git a/lib/Target/XCore/XCoreRegisterInfo.cpp b/lib/Target/XCore/XCoreRegisterInfo.cpp index 8cc2572..381e9ab 100644 --- a/lib/Target/XCore/XCoreRegisterInfo.cpp +++ b/lib/Target/XCore/XCoreRegisterInfo.cpp @@ -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 { diff --git a/lib/Target/XCore/XCoreRegisterInfo.h b/lib/Target/XCore/XCoreRegisterInfo.h index 9b4231c..047fc27 100644 --- a/lib/Target/XCore/XCoreRegisterInfo.h +++ b/lib/Target/XCore/XCoreRegisterInfo.h @@ -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; diff --git a/lib/Target/XCore/XCoreRegisterInfo.td b/lib/Target/XCore/XCoreRegisterInfo.td index 62daf5d..99cd18f 100644 --- a/lib/Target/XCore/XCoreRegisterInfo.td +++ b/lib/Target/XCore/XCoreRegisterInfo.td @@ -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();  | 
