forked from OSchip/llvm-project
Remove the need to cache the subtarget in the ARM TargetRegisterInfo
classes. Replace the frame pointer initialization with a static function that'll look it up via the subtarget on the MachineFunction. llvm-svn: 232010
This commit is contained in:
parent
0ea61e91dc
commit
34085832f8
|
@ -45,21 +45,24 @@
|
|||
|
||||
using namespace llvm;
|
||||
|
||||
ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMSubtarget &sti)
|
||||
: ARMGenRegisterInfo(ARM::LR, 0, 0, ARM::PC), STI(sti), BasePtr(ARM::R6) {
|
||||
ARMBaseRegisterInfo::ARMBaseRegisterInfo()
|
||||
: ARMGenRegisterInfo(ARM::LR, 0, 0, ARM::PC), BasePtr(ARM::R6) {}
|
||||
|
||||
static unsigned getFramePointerReg(const ARMSubtarget &STI) {
|
||||
if (STI.isTargetMachO()) {
|
||||
if (STI.isTargetDarwin() || STI.isThumb1Only())
|
||||
FramePtr = ARM::R7;
|
||||
return ARM::R7;
|
||||
else
|
||||
FramePtr = ARM::R11;
|
||||
return ARM::R11;
|
||||
} else if (STI.isTargetWindows())
|
||||
FramePtr = ARM::R11;
|
||||
return ARM::R11;
|
||||
else // ARM EABI
|
||||
FramePtr = STI.isThumb() ? ARM::R7 : ARM::R11;
|
||||
return STI.isThumb() ? ARM::R7 : ARM::R11;
|
||||
}
|
||||
|
||||
const MCPhysReg*
|
||||
ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
const ARMSubtarget &STI = MF->getSubtarget<ARMSubtarget>();
|
||||
const MCPhysReg *RegList =
|
||||
STI.isTargetDarwin() ? CSR_iOS_SaveList : CSR_AAPCS_SaveList;
|
||||
|
||||
|
@ -90,6 +93,7 @@ ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
|||
const uint32_t *
|
||||
ARMBaseRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
|
||||
CallingConv::ID CC) const {
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
if (CC == CallingConv::GHC)
|
||||
// This is academic becase all GHC calls are (supposed to be) tail calls
|
||||
return CSR_NoRegs_RegMask;
|
||||
|
@ -104,6 +108,7 @@ ARMBaseRegisterInfo::getNoPreservedMask() const {
|
|||
const uint32_t *
|
||||
ARMBaseRegisterInfo::getThisReturnPreservedMask(const MachineFunction &MF,
|
||||
CallingConv::ID CC) const {
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
// This should return a register mask that is the same as that returned by
|
||||
// getCallPreservedMask but that additionally preserves the register used for
|
||||
// the first i32 argument (which must also be the register used to return a
|
||||
|
@ -121,7 +126,8 @@ ARMBaseRegisterInfo::getThisReturnPreservedMask(const MachineFunction &MF,
|
|||
|
||||
BitVector ARMBaseRegisterInfo::
|
||||
getReservedRegs(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetFrameLowering *TFI = STI.getFrameLowering();
|
||||
|
||||
// FIXME: avoid re-calculating this every time.
|
||||
BitVector Reserved(getNumRegs());
|
||||
|
@ -130,7 +136,7 @@ getReservedRegs(const MachineFunction &MF) const {
|
|||
Reserved.set(ARM::FPSCR);
|
||||
Reserved.set(ARM::APSR_NZCV);
|
||||
if (TFI->hasFP(MF))
|
||||
Reserved.set(FramePtr);
|
||||
Reserved.set(getFramePointerReg(STI));
|
||||
if (hasBasePointer(MF))
|
||||
Reserved.set(BasePtr);
|
||||
// Some targets reserve R9.
|
||||
|
@ -187,7 +193,8 @@ ARMBaseRegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
|
|||
unsigned
|
||||
ARMBaseRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetFrameLowering *TFI = STI.getFrameLowering();
|
||||
|
||||
switch (RC->getID()) {
|
||||
default:
|
||||
|
@ -327,7 +334,7 @@ bool ARMBaseRegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
|||
return false;
|
||||
// Stack realignment requires a frame pointer. If we already started
|
||||
// register allocation with frame pointer elimination, it is too late now.
|
||||
if (!MRI->canReserveReg(FramePtr))
|
||||
if (!MRI->canReserveReg(getFramePointerReg(MF.getSubtarget<ARMSubtarget>())))
|
||||
return false;
|
||||
// We may also need a base pointer if there are dynamic allocas or stack
|
||||
// pointer adjustments around calls.
|
||||
|
@ -361,10 +368,11 @@ cannotEliminateFrame(const MachineFunction &MF) const {
|
|||
|
||||
unsigned
|
||||
ARMBaseRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetFrameLowering *TFI = STI.getFrameLowering();
|
||||
|
||||
if (TFI->hasFP(MF))
|
||||
return FramePtr;
|
||||
return getFramePointerReg(STI);
|
||||
return ARM::SP;
|
||||
}
|
||||
|
||||
|
|
|
@ -82,18 +82,13 @@ static inline bool isCalleeSavedRegister(unsigned Reg,
|
|||
|
||||
class ARMBaseRegisterInfo : public ARMGenRegisterInfo {
|
||||
protected:
|
||||
const ARMSubtarget &STI;
|
||||
|
||||
/// FramePtr - ARM physical register used as frame ptr.
|
||||
unsigned FramePtr;
|
||||
|
||||
/// BasePtr - ARM physical register used as a base ptr in complex stack
|
||||
/// frames. I.e., when we need a 3rd base, not just SP and FP, due to
|
||||
/// variable size stack objects.
|
||||
unsigned BasePtr;
|
||||
|
||||
// Can be only subclassed.
|
||||
explicit ARMBaseRegisterInfo(const ARMSubtarget &STI);
|
||||
explicit ARMBaseRegisterInfo();
|
||||
|
||||
// Return the opcode that implements 'Op', or 0 if no opcode
|
||||
unsigned getOpcode(int Op) const;
|
||||
|
|
|
@ -30,8 +30,7 @@
|
|||
using namespace llvm;
|
||||
|
||||
ARMInstrInfo::ARMInstrInfo(const ARMSubtarget &STI)
|
||||
: ARMBaseInstrInfo(STI), RI(STI) {
|
||||
}
|
||||
: ARMBaseInstrInfo(STI), RI() {}
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void ARMInstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
|
||||
|
|
|
@ -16,6 +16,4 @@ using namespace llvm;
|
|||
|
||||
void ARMRegisterInfo::anchor() { }
|
||||
|
||||
ARMRegisterInfo::ARMRegisterInfo(const ARMSubtarget &sti)
|
||||
: ARMBaseRegisterInfo(sti) {
|
||||
}
|
||||
ARMRegisterInfo::ARMRegisterInfo() : ARMBaseRegisterInfo() {}
|
||||
|
|
|
@ -23,7 +23,7 @@ class ARMSubtarget;
|
|||
struct ARMRegisterInfo : public ARMBaseRegisterInfo {
|
||||
virtual void anchor();
|
||||
public:
|
||||
ARMRegisterInfo(const ARMSubtarget &STI);
|
||||
ARMRegisterInfo();
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
|
|
@ -22,8 +22,7 @@
|
|||
using namespace llvm;
|
||||
|
||||
Thumb1InstrInfo::Thumb1InstrInfo(const ARMSubtarget &STI)
|
||||
: ARMBaseInstrInfo(STI), RI(STI) {
|
||||
}
|
||||
: ARMBaseInstrInfo(STI), RI() {}
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void Thumb1InstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
|
||||
|
|
|
@ -38,9 +38,7 @@ extern cl::opt<bool> ReuseFrameIndexVals;
|
|||
|
||||
using namespace llvm;
|
||||
|
||||
Thumb1RegisterInfo::Thumb1RegisterInfo(const ARMSubtarget &sti)
|
||||
: ARMBaseRegisterInfo(sti) {
|
||||
}
|
||||
Thumb1RegisterInfo::Thumb1RegisterInfo() : ARMBaseRegisterInfo() {}
|
||||
|
||||
const TargetRegisterClass *
|
||||
Thumb1RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
|
||||
|
@ -58,19 +56,16 @@ Thumb1RegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
|||
|
||||
/// emitLoadConstPool - Emits a load from constpool to materialize the
|
||||
/// specified immediate.
|
||||
void
|
||||
Thumb1RegisterInfo::emitLoadConstPool(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator &MBBI,
|
||||
DebugLoc dl,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
int Val,
|
||||
ARMCC::CondCodes Pred, unsigned PredReg,
|
||||
unsigned MIFlags) const {
|
||||
void Thumb1RegisterInfo::emitLoadConstPool(
|
||||
MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl,
|
||||
unsigned DestReg, unsigned SubIdx, int Val, ARMCC::CondCodes Pred,
|
||||
unsigned PredReg, unsigned MIFlags) const {
|
||||
assert((isARMLowRegister(DestReg) ||
|
||||
isVirtualRegister(DestReg)) &&
|
||||
"Thumb1 does not have ldr to high register");
|
||||
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetInstrInfo &TII = *STI.getInstrInfo();
|
||||
MachineConstantPool *ConstantPool = MF.getConstantPool();
|
||||
const Constant *C = ConstantInt::get(
|
||||
|
@ -388,6 +383,8 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
|
|||
|
||||
void Thumb1RegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
|
||||
int64_t Offset) const {
|
||||
const MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const ARMBaseInstrInfo &TII = *STI.getInstrInfo();
|
||||
int Off = Offset; // ARM doesn't need the general 64-bit offsets
|
||||
unsigned i = 0;
|
||||
|
@ -414,6 +411,7 @@ Thumb1RegisterInfo::saveScavengerRegister(MachineBasicBlock &MBB,
|
|||
// off the frame pointer (if, for example, there are alloca() calls in
|
||||
// the function, the offset will be negative. Use R12 instead since that's
|
||||
// a call clobbered register that we know won't be used in Thumb1 mode.
|
||||
const ARMSubtarget &STI = MBB.getParent()->getSubtarget<ARMSubtarget>();
|
||||
const TargetInstrInfo &TII = *STI.getInstrInfo();
|
||||
DebugLoc DL;
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, TII.get(ARM::tMOVr))
|
||||
|
@ -460,6 +458,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
|||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const ARMBaseInstrInfo &TII = *STI.getInstrInfo();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
DebugLoc dl = MI.getDebugLoc();
|
||||
|
|
|
@ -24,7 +24,7 @@ namespace llvm {
|
|||
|
||||
struct Thumb1RegisterInfo : public ARMBaseRegisterInfo {
|
||||
public:
|
||||
Thumb1RegisterInfo(const ARMSubtarget &STI);
|
||||
Thumb1RegisterInfo();
|
||||
|
||||
const TargetRegisterClass *
|
||||
getLargestLegalSuperClass(const TargetRegisterClass *RC,
|
||||
|
|
|
@ -30,8 +30,7 @@ OldT2IfCvt("old-thumb2-ifcvt", cl::Hidden,
|
|||
cl::init(false));
|
||||
|
||||
Thumb2InstrInfo::Thumb2InstrInfo(const ARMSubtarget &STI)
|
||||
: ARMBaseInstrInfo(STI), RI(STI) {
|
||||
}
|
||||
: ARMBaseInstrInfo(STI), RI() {}
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void Thumb2InstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
|
||||
|
|
|
@ -25,9 +25,7 @@
|
|||
#include "llvm/Target/TargetMachine.h"
|
||||
using namespace llvm;
|
||||
|
||||
Thumb2RegisterInfo::Thumb2RegisterInfo(const ARMSubtarget &sti)
|
||||
: ARMBaseRegisterInfo(sti) {
|
||||
}
|
||||
Thumb2RegisterInfo::Thumb2RegisterInfo() : ARMBaseRegisterInfo() {}
|
||||
|
||||
/// emitLoadConstPool - Emits a load from constpool to materialize the
|
||||
/// specified immediate.
|
||||
|
|
|
@ -23,7 +23,7 @@ class ARMSubtarget;
|
|||
|
||||
struct Thumb2RegisterInfo : public ARMBaseRegisterInfo {
|
||||
public:
|
||||
Thumb2RegisterInfo(const ARMSubtarget &STI);
|
||||
Thumb2RegisterInfo();
|
||||
|
||||
/// emitLoadConstPool - Emits a load from constpool to materialize the
|
||||
/// specified immediate.
|
||||
|
|
Loading…
Reference in New Issue