forked from OSchip/llvm-project
Enable thumb1 register scavenging by default.
llvm-svn: 83494
This commit is contained in:
parent
fe8dc76f80
commit
37cf79e5a6
|
@ -37,11 +37,6 @@
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
// FIXME: This cmd line option conditionalizes the new register scavenging
|
|
||||||
// implemenation in PEI. Remove the option when scavenging works well enough
|
|
||||||
// to be the default.
|
|
||||||
extern cl::opt<bool> FrameIndexVirtualScavenging;
|
|
||||||
|
|
||||||
Thumb1RegisterInfo::Thumb1RegisterInfo(const ARMBaseInstrInfo &tii,
|
Thumb1RegisterInfo::Thumb1RegisterInfo(const ARMBaseInstrInfo &tii,
|
||||||
const ARMSubtarget &sti)
|
const ARMSubtarget &sti)
|
||||||
: ARMBaseRegisterInfo(tii, sti) {
|
: ARMBaseRegisterInfo(tii, sti) {
|
||||||
|
@ -84,7 +79,13 @@ Thumb1RegisterInfo::getPhysicalRegisterRegClass(unsigned Reg, EVT VT) const {
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Thumb1RegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
|
Thumb1RegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
|
||||||
return FrameIndexVirtualScavenging;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Thumb1RegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF)
|
||||||
|
const {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Thumb1RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
|
bool Thumb1RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
|
||||||
|
@ -128,13 +129,7 @@ void emitThumbRegPlusImmInReg(MachineBasicBlock &MBB,
|
||||||
unsigned LdReg = DestReg;
|
unsigned LdReg = DestReg;
|
||||||
if (DestReg == ARM::SP) {
|
if (DestReg == ARM::SP) {
|
||||||
assert(BaseReg == ARM::SP && "Unexpected!");
|
assert(BaseReg == ARM::SP && "Unexpected!");
|
||||||
if (FrameIndexVirtualScavenging) {
|
LdReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
|
||||||
LdReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
|
|
||||||
} else {
|
|
||||||
LdReg = ARM::R3;
|
|
||||||
BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::R12)
|
|
||||||
.addReg(ARM::R3, RegState::Kill);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumBytes <= 255 && NumBytes >= 0)
|
if (NumBytes <= 255 && NumBytes >= 0)
|
||||||
|
@ -159,10 +154,6 @@ void emitThumbRegPlusImmInReg(MachineBasicBlock &MBB,
|
||||||
else
|
else
|
||||||
MIB.addReg(LdReg).addReg(BaseReg, RegState::Kill);
|
MIB.addReg(LdReg).addReg(BaseReg, RegState::Kill);
|
||||||
AddDefaultPred(MIB);
|
AddDefaultPred(MIB);
|
||||||
|
|
||||||
if (!FrameIndexVirtualScavenging && DestReg == ARM::SP)
|
|
||||||
BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R3)
|
|
||||||
.addReg(ARM::R12, RegState::Kill);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// calcNumMI - Returns the number of instructions required to materialize
|
/// calcNumMI - Returns the number of instructions required to materialize
|
||||||
|
@ -635,7 +626,6 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||||
else // tLDR has an extra register operand.
|
else // tLDR has an extra register operand.
|
||||||
MI.addOperand(MachineOperand::CreateReg(0, false));
|
MI.addOperand(MachineOperand::CreateReg(0, false));
|
||||||
} else if (Desc.mayStore()) {
|
} else if (Desc.mayStore()) {
|
||||||
if (FrameIndexVirtualScavenging) {
|
|
||||||
VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
|
VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
|
||||||
assert (Value && "Frame index virtual allocated, but Value arg is NULL!");
|
assert (Value && "Frame index virtual allocated, but Value arg is NULL!");
|
||||||
*Value = Offset;
|
*Value = Offset;
|
||||||
|
@ -658,52 +648,6 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||||
MI.addOperand(MachineOperand::CreateReg(FrameReg, false));
|
MI.addOperand(MachineOperand::CreateReg(FrameReg, false));
|
||||||
else // tSTR has an extra register operand.
|
else // tSTR has an extra register operand.
|
||||||
MI.addOperand(MachineOperand::CreateReg(0, false));
|
MI.addOperand(MachineOperand::CreateReg(0, false));
|
||||||
} else {
|
|
||||||
// FIXME! This is horrific!!! We need register scavenging.
|
|
||||||
// Our temporary workaround has marked r3 unavailable. Of course, r3 is
|
|
||||||
// also a ABI register so it's possible that is is the register that is
|
|
||||||
// being storing here. If that's the case, we do the following:
|
|
||||||
// r12 = r2
|
|
||||||
// Use r2 to materialize sp + offset
|
|
||||||
// str r3, r2
|
|
||||||
// r2 = r12
|
|
||||||
unsigned ValReg = MI.getOperand(0).getReg();
|
|
||||||
unsigned TmpReg = ARM::R3;
|
|
||||||
bool UseRR = false;
|
|
||||||
if (ValReg == ARM::R3) {
|
|
||||||
BuildMI(MBB, II, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::R12)
|
|
||||||
.addReg(ARM::R2, RegState::Kill);
|
|
||||||
TmpReg = ARM::R2;
|
|
||||||
}
|
|
||||||
if (TmpReg == ARM::R3 && AFI->isR3LiveIn())
|
|
||||||
BuildMI(MBB, II, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::R12)
|
|
||||||
.addReg(ARM::R3, RegState::Kill);
|
|
||||||
if (Opcode == ARM::tSpill) {
|
|
||||||
if (FrameReg == ARM::SP)
|
|
||||||
emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg,
|
|
||||||
Offset, false, TII, *this, dl);
|
|
||||||
else {
|
|
||||||
emitLoadConstPool(MBB, II, dl, TmpReg, 0, Offset);
|
|
||||||
UseRR = true;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII,
|
|
||||||
*this, dl);
|
|
||||||
MI.setDesc(TII.get(ARM::tSTR));
|
|
||||||
MI.getOperand(i).ChangeToRegister(TmpReg, false, false, true);
|
|
||||||
if (UseRR) // Use [reg, reg] addrmode.
|
|
||||||
MI.addOperand(MachineOperand::CreateReg(FrameReg, false));
|
|
||||||
else // tSTR has an extra register operand.
|
|
||||||
MI.addOperand(MachineOperand::CreateReg(0, false));
|
|
||||||
|
|
||||||
MachineBasicBlock::iterator NII = next(II);
|
|
||||||
if (ValReg == ARM::R3)
|
|
||||||
BuildMI(MBB, NII, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R2)
|
|
||||||
.addReg(ARM::R12, RegState::Kill);
|
|
||||||
if (TmpReg == ARM::R3 && AFI->isR3LiveIn())
|
|
||||||
BuildMI(MBB, NII, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R3)
|
|
||||||
.addReg(ARM::R12, RegState::Kill);
|
|
||||||
}
|
|
||||||
} else
|
} else
|
||||||
assert(false && "Unexpected opcode!");
|
assert(false && "Unexpected opcode!");
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ public:
|
||||||
getPhysicalRegisterRegClass(unsigned Reg, EVT VT = MVT::Other) const;
|
getPhysicalRegisterRegClass(unsigned Reg, EVT VT = MVT::Other) const;
|
||||||
|
|
||||||
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
||||||
|
bool requiresFrameIndexScavenging(const MachineFunction &MF) const;
|
||||||
|
|
||||||
bool hasReservedCallFrame(MachineFunction &MF) const;
|
bool hasReservedCallFrame(MachineFunction &MF) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue