mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-22 13:29:44 +00:00
Target RegisterInfo: devirtualize TargetFrameLowering
Summary: The target frame lowering's concrete type is always known in RegisterInfo, yet it's only sometimes devirtualized through a static_cast. This change adds an auto-generated static function <Target>GenRegisterInfo::getFrameLowering(const MachineFunction &MF) which does this devirtualization, and uses this function in all targets which can. This change was suggested by sunfish in D11070 for WebAssembly, I figure that I may as well improve the other targets while I'm here. Subscribers: sunfish, ted, llvm-commits, jfb Differential Revision: http://reviews.llvm.org/D11093 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241921 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
892af54a91
commit
99cb989593
@ -90,7 +90,7 @@ AArch64RegisterInfo::getThisReturnPreservedMask(const MachineFunction &MF,
|
||||
|
||||
BitVector
|
||||
AArch64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
// FIXME: avoid re-calculating this every time.
|
||||
BitVector Reserved(getNumRegs());
|
||||
@ -119,7 +119,7 @@ AArch64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
|
||||
bool AArch64RegisterInfo::isReservedReg(const MachineFunction &MF,
|
||||
unsigned Reg) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
switch (Reg) {
|
||||
default:
|
||||
@ -198,11 +198,9 @@ bool AArch64RegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
bool
|
||||
AArch64RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
const Function *F = MF.getFunction();
|
||||
unsigned StackAlign = MF.getTarget()
|
||||
.getSubtargetImpl(*MF.getFunction())
|
||||
->getFrameLowering()
|
||||
->getStackAlignment();
|
||||
unsigned StackAlign = TFI->getStackAlignment();
|
||||
bool requiresRealignment =
|
||||
((MFI->getMaxAlignment() > StackAlign) ||
|
||||
F->getAttributes().hasAttribute(AttributeSet::FunctionIndex,
|
||||
@ -213,8 +211,7 @@ AArch64RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
||||
|
||||
unsigned
|
||||
AArch64RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
return TFI->hasFP(MF) ? AArch64::FP : AArch64::SP;
|
||||
}
|
||||
|
||||
@ -280,7 +277,7 @@ bool AArch64RegisterInfo::needsFrameBaseReg(MachineInstr *MI,
|
||||
// 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 TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
// Estimate an offset from the frame pointer.
|
||||
@ -376,8 +373,7 @@ void AArch64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const AArch64InstrInfo *TII =
|
||||
MF.getSubtarget<AArch64Subtarget>().getInstrInfo();
|
||||
const AArch64FrameLowering *TFI = static_cast<const AArch64FrameLowering *>(
|
||||
MF.getSubtarget().getFrameLowering());
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
|
||||
unsigned FrameReg;
|
||||
@ -415,7 +411,7 @@ namespace llvm {
|
||||
|
||||
unsigned AArch64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const AArch64FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
switch (RC->getID()) {
|
||||
default:
|
||||
|
@ -127,7 +127,7 @@ ARMBaseRegisterInfo::getThisReturnPreservedMask(const MachineFunction &MF,
|
||||
BitVector ARMBaseRegisterInfo::
|
||||
getReservedRegs(const MachineFunction &MF) const {
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetFrameLowering *TFI = STI.getFrameLowering();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
// FIXME: avoid re-calculating this every time.
|
||||
BitVector Reserved(getNumRegs());
|
||||
@ -194,7 +194,7 @@ unsigned
|
||||
ARMBaseRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetFrameLowering *TFI = STI.getFrameLowering();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
switch (RC->getID()) {
|
||||
default:
|
||||
@ -302,7 +302,7 @@ ARMBaseRegisterInfo::updateRegAllocHint(unsigned Reg, unsigned NewReg,
|
||||
bool ARMBaseRegisterInfo::hasBasePointer(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
// When outgoing call frames are so large that we adjust the stack pointer
|
||||
// around the call, we can no longer use the stack pointer to reach the
|
||||
@ -333,6 +333,7 @@ bool ARMBaseRegisterInfo::hasBasePointer(const MachineFunction &MF) const {
|
||||
bool ARMBaseRegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
const MachineRegisterInfo *MRI = &MF.getRegInfo();
|
||||
const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
// We can't realign the stack if:
|
||||
// 1. Dynamic stack realignment is explicitly disabled,
|
||||
// 2. This is a Thumb1 function (it's not useful, so we don't bother), or
|
||||
@ -347,7 +348,7 @@ bool ARMBaseRegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
return false;
|
||||
// We may also need a base pointer if there are dynamic allocas or stack
|
||||
// pointer adjustments around calls.
|
||||
if (MF.getSubtarget().getFrameLowering()->hasReservedCallFrame(MF))
|
||||
if (TFI->hasReservedCallFrame(MF))
|
||||
return true;
|
||||
// A base pointer is required and allowed. Check that it isn't too late to
|
||||
// reserve it.
|
||||
@ -357,9 +358,9 @@ bool ARMBaseRegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
bool ARMBaseRegisterInfo::
|
||||
needsStackRealignment(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
const Function *F = MF.getFunction();
|
||||
unsigned StackAlign =
|
||||
MF.getSubtarget().getFrameLowering()->getStackAlignment();
|
||||
unsigned StackAlign = TFI->getStackAlignment();
|
||||
bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
|
||||
F->hasFnAttribute(Attribute::StackAlignment));
|
||||
|
||||
@ -378,7 +379,7 @@ cannotEliminateFrame(const MachineFunction &MF) const {
|
||||
unsigned
|
||||
ARMBaseRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();
|
||||
const TargetFrameLowering *TFI = STI.getFrameLowering();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
if (TFI->hasFP(MF))
|
||||
return getFramePointerReg(STI);
|
||||
@ -517,7 +518,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 TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
|
||||
@ -694,8 +695,7 @@ ARMBaseRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const ARMBaseInstrInfo &TII =
|
||||
*static_cast<const ARMBaseInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const ARMFrameLowering *TFI = static_cast<const ARMFrameLowering *>(
|
||||
MF.getSubtarget().getFrameLowering());
|
||||
const ARMFrameLowering *TFI = getFrameLowering(MF);
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
assert(!AFI->isThumb1OnlyFunction() &&
|
||||
"This eliminateFrameIndex does not support Thumb1!");
|
||||
|
@ -221,7 +221,7 @@ unsigned HexagonRegisterInfo::getRARegister() const {
|
||||
|
||||
unsigned HexagonRegisterInfo::getFrameRegister(const MachineFunction
|
||||
&MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const HexagonFrameLowering *TFI = getFrameLowering(MF);
|
||||
if (TFI->hasFP(MF))
|
||||
return Hexagon::R30;
|
||||
return Hexagon::R29;
|
||||
@ -240,7 +240,8 @@ unsigned HexagonRegisterInfo::getStackRegister() const {
|
||||
|
||||
bool
|
||||
HexagonRegisterInfo::useFPForScavengingIndex(const MachineFunction &MF) const {
|
||||
return MF.getSubtarget().getFrameLowering()->hasFP(MF);
|
||||
const HexagonFrameLowering *TFI = getFrameLowering(MF);
|
||||
return TFI->hasFP(MF);
|
||||
}
|
||||
|
||||
|
||||
|
@ -37,7 +37,7 @@ MSP430RegisterInfo::MSP430RegisterInfo()
|
||||
|
||||
const MCPhysReg*
|
||||
MSP430RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
|
||||
const MSP430FrameLowering *TFI = getFrameLowering(*MF);
|
||||
const Function* F = MF->getFunction();
|
||||
static const MCPhysReg CalleeSavedRegs[] = {
|
||||
MSP430::FP, MSP430::R5, MSP430::R6, MSP430::R7,
|
||||
@ -73,7 +73,7 @@ MSP430RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector MSP430RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const MSP430FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
// Mark 4 special registers with subregisters as reserved.
|
||||
Reserved.set(MSP430::PCB);
|
||||
@ -109,7 +109,7 @@ MSP430RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const MSP430FrameLowering *TFI = getFrameLowering(MF);
|
||||
DebugLoc dl = MI.getDebugLoc();
|
||||
int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
|
||||
|
||||
@ -156,7 +156,6 @@ MSP430RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
}
|
||||
|
||||
unsigned MSP430RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
|
||||
const MSP430FrameLowering *TFI = getFrameLowering(MF);
|
||||
return TFI->hasFP(MF) ? MSP430::FP : MSP430::SP;
|
||||
}
|
||||
|
@ -165,8 +165,7 @@ void PPCRegisterInfo::adjustStackMapLiveOutMask(uint32_t *Mask) const {
|
||||
BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
|
||||
const PPCFrameLowering *PPCFI =
|
||||
static_cast<const PPCFrameLowering *>(Subtarget.getFrameLowering());
|
||||
const PPCFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
// The ZERO register is not really a register, but the representation of r0
|
||||
// when used in instructions that treat r0 as the constant 0.
|
||||
@ -209,7 +208,7 @@ BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
Reserved.set(PPC::X1);
|
||||
Reserved.set(PPC::X13);
|
||||
|
||||
if (PPCFI->needsFP(MF))
|
||||
if (TFI->needsFP(MF))
|
||||
Reserved.set(PPC::X31);
|
||||
|
||||
if (hasBasePointer(MF))
|
||||
@ -230,7 +229,7 @@ BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
}
|
||||
}
|
||||
|
||||
if (PPCFI->needsFP(MF))
|
||||
if (TFI->needsFP(MF))
|
||||
Reserved.set(PPC::R31);
|
||||
|
||||
if (hasBasePointer(MF)) {
|
||||
@ -256,8 +255,7 @@ BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
|
||||
unsigned PPCRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
|
||||
const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
|
||||
const PPCFrameLowering *TFI = getFrameLowering(MF);
|
||||
const unsigned DefaultSafety = 1;
|
||||
|
||||
switch (RC->getID()) {
|
||||
@ -341,7 +339,8 @@ void PPCRegisterInfo::lowerDynamicAlloc(MachineBasicBlock::iterator II) const {
|
||||
unsigned FrameSize = MFI->getStackSize();
|
||||
|
||||
// Get stack alignments.
|
||||
unsigned TargetAlign = Subtarget.getFrameLowering()->getStackAlignment();
|
||||
const PPCFrameLowering *TFI = getFrameLowering(MF);
|
||||
unsigned TargetAlign = TFI->getStackAlignment();
|
||||
unsigned MaxAlign = MFI->getMaxAlignment();
|
||||
assert((maxCallFrameSize & (MaxAlign-1)) == 0 &&
|
||||
"Maximum call-frame size not sufficiently aligned");
|
||||
@ -864,8 +863,7 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
}
|
||||
|
||||
unsigned PPCRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
|
||||
const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
|
||||
const PPCFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
if (!TM.isPPC64())
|
||||
return TFI->hasFP(MF) ? PPC::R31 : PPC::R1;
|
||||
@ -908,10 +906,10 @@ bool PPCRegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
}
|
||||
|
||||
bool PPCRegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
||||
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
|
||||
const PPCFrameLowering *TFI = getFrameLowering(MF);
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const Function *F = MF.getFunction();
|
||||
unsigned StackAlign = Subtarget.getFrameLowering()->getStackAlignment();
|
||||
unsigned StackAlign = TFI->getStackAlignment();
|
||||
bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
|
||||
F->hasFnAttribute(Attribute::StackAlignment));
|
||||
|
||||
@ -946,11 +944,8 @@ needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
|
||||
|
||||
MachineBasicBlock &MBB = *MI->getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
|
||||
const PPCFrameLowering *PPCFI =
|
||||
static_cast<const PPCFrameLowering *>(Subtarget.getFrameLowering());
|
||||
unsigned StackEst =
|
||||
PPCFI->determineFrameLayout(MF, false, true);
|
||||
const PPCFrameLowering *TFI = getFrameLowering(MF);
|
||||
unsigned StackEst = TFI->determineFrameLayout(MF, false, true);
|
||||
|
||||
// If we likely don't need a stack frame, then we probably don't need a
|
||||
// virtual base register either.
|
||||
@ -1034,4 +1029,3 @@ bool PPCRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
|
||||
MI->getOpcode() == TargetOpcode::PATCHPOINT ||
|
||||
(isInt<16>(Offset) && (!usesIXAddr(*MI) || (Offset & 3) == 0));
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ SystemZRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
|
||||
BitVector
|
||||
SystemZRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const SystemZFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
if (TFI->hasFP(MF)) {
|
||||
// R11D is the frame pointer. Reserve all aliases.
|
||||
@ -64,7 +64,7 @@ SystemZRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
auto *TII =
|
||||
static_cast<const SystemZInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const SystemZFrameLowering *TFI = getFrameLowering(MF);
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
|
||||
// Decompose the frame index into a base and offset.
|
||||
@ -135,6 +135,6 @@ SystemZRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
|
||||
|
||||
unsigned
|
||||
SystemZRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const SystemZFrameLowering *TFI = getFrameLowering(MF);
|
||||
return TFI->hasFP(MF) ? SystemZ::R11D : SystemZ::R15D;
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
|
||||
unsigned
|
||||
X86RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
unsigned FPDiff = TFI->hasFP(MF) ? 1 : 0;
|
||||
switch (RC->getID()) {
|
||||
@ -343,7 +343,7 @@ X86RegisterInfo::getNoPreservedMask() const {
|
||||
|
||||
BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
// Set the stack-pointer register and its aliases as reserved.
|
||||
for (MCSubRegIterator I(X86::RSP, this, /*IncludeSelf=*/true); I.isValid();
|
||||
@ -477,9 +477,9 @@ bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
|
||||
|
||||
bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
const Function *F = MF.getFunction();
|
||||
unsigned StackAlign =
|
||||
MF.getSubtarget().getFrameLowering()->getStackAlignment();
|
||||
unsigned StackAlign = TFI->getStackAlignment();
|
||||
bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
|
||||
F->hasFnAttribute(Attribute::StackAlignment));
|
||||
|
||||
@ -503,7 +503,7 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
RegScavenger *RS) const {
|
||||
MachineInstr &MI = *II;
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
|
||||
unsigned BasePtr;
|
||||
|
||||
@ -529,8 +529,7 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
bool IsWinEH = MF.getTarget().getMCAsmInfo()->usesWindowsCFI();
|
||||
int Offset;
|
||||
if (IsWinEH)
|
||||
Offset = static_cast<const X86FrameLowering *>(TFI)
|
||||
->getFrameIndexOffsetFromSP(MF, FrameIndex);
|
||||
Offset = TFI->getFrameIndexOffsetFromSP(MF, FrameIndex);
|
||||
else
|
||||
Offset = TFI->getFrameIndexOffset(MF, FrameIndex);
|
||||
FI.ChangeToImmediate(Offset);
|
||||
@ -584,7 +583,7 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
}
|
||||
|
||||
unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
return TFI->hasFP(MF) ? FramePtr : StackPtr;
|
||||
}
|
||||
|
||||
|
@ -222,7 +222,7 @@ XCoreRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
XCore::R8, XCore::R9,
|
||||
0
|
||||
};
|
||||
const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
|
||||
const XCoreFrameLowering *TFI = getFrameLowering(*MF);
|
||||
if (TFI->hasFP(*MF))
|
||||
return CalleeSavedRegsFP;
|
||||
return CalleeSavedRegs;
|
||||
@ -230,7 +230,7 @@ XCoreRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
||||
BitVector XCoreRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const XCoreFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
Reserved.set(XCore::CP);
|
||||
Reserved.set(XCore::DP);
|
||||
@ -270,7 +270,7 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
const XCoreInstrInfo &TII =
|
||||
*static_cast<const XCoreInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const XCoreFrameLowering *TFI = getFrameLowering(MF);
|
||||
int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
|
||||
int StackSize = MF.getFrameInfo()->getStackSize();
|
||||
|
||||
@ -324,7 +324,7 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
|
||||
|
||||
unsigned XCoreRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const XCoreFrameLowering *TFI = getFrameLowering(MF);
|
||||
|
||||
return TFI->hasFP(MF) ? XCore::R10 : XCore::SP;
|
||||
}
|
||||
|
@ -1070,6 +1070,8 @@ RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
|
||||
|
||||
OS << "namespace llvm {\n\n";
|
||||
|
||||
OS << "class " << TargetName << "FrameLowering;\n\n";
|
||||
|
||||
OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
|
||||
<< " explicit " << ClassName
|
||||
<< "(unsigned RA, unsigned D = 0, unsigned E = 0, unsigned PC = 0);\n"
|
||||
@ -1096,6 +1098,9 @@ RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
|
||||
<< "unsigned RegUnit) const override;\n"
|
||||
<< " ArrayRef<const char *> getRegMaskNames() const override;\n"
|
||||
<< " ArrayRef<const uint32_t *> getRegMasks() const override;\n"
|
||||
<< " /// Devirtualized TargetFrameLowering.\n"
|
||||
<< " static const " << TargetName << "FrameLowering *getFrameLowering(\n"
|
||||
<< " const MachineFunction &MF);\n"
|
||||
<< "};\n\n";
|
||||
|
||||
const auto &RegisterClasses = RegBank.getRegClasses();
|
||||
@ -1467,6 +1472,13 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
<< ");\n";
|
||||
OS << "}\n\n";
|
||||
|
||||
OS << "const " << TargetName << "FrameLowering *"
|
||||
<< TargetName << "GenRegisterInfo::\n"
|
||||
<< " getFrameLowering(const MachineFunction &MF) {\n"
|
||||
<< " return static_cast<const " << TargetName << "FrameLowering *>(\n"
|
||||
<< " MF.getSubtarget().getFrameLowering());\n"
|
||||
<< "}\n\n";
|
||||
|
||||
OS << "} // End llvm namespace\n";
|
||||
OS << "#endif // GET_REGINFO_TARGET_DESC\n\n";
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user