forked from OSchip/llvm-project
Refactor away tSpill and tRestore pseudos in ARM backend.
The tSpill and tRestore instructions are just copies of the tSTRspi and tLDRspi instructions, respectively. Just use those directly instead. llvm-svn: 134092
This commit is contained in:
parent
326701e2c7
commit
d86f34d631
|
@ -792,7 +792,7 @@ ARMBaseInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
|
|||
break;
|
||||
case ARM::STRi12:
|
||||
case ARM::t2STRi12:
|
||||
case ARM::tSpill:
|
||||
case ARM::tSTRspi:
|
||||
case ARM::VSTRD:
|
||||
case ARM::VSTRS:
|
||||
if (MI->getOperand(1).isFI() &&
|
||||
|
@ -927,7 +927,7 @@ ARMBaseInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
|||
break;
|
||||
case ARM::LDRi12:
|
||||
case ARM::t2LDRi12:
|
||||
case ARM::tRestore:
|
||||
case ARM::tLDRspi:
|
||||
case ARM::VLDRD:
|
||||
case ARM::VLDRS:
|
||||
if (MI->getOperand(1).isFI() &&
|
||||
|
|
|
@ -686,19 +686,6 @@ def tLDRspi : T1pIs<(outs tGPR:$Rt), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
|
|||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
// Special instruction for restore. It cannot clobber condition register
|
||||
// when it's expanded by eliminateCallFramePseudoInstr().
|
||||
let canFoldAsLoad = 1, mayLoad = 1, neverHasSideEffects = 1 in
|
||||
// FIXME: Pseudo for tLDRspi
|
||||
def tRestore : T1pIs<(outs tGPR:$dst), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
|
||||
"ldr", "\t$dst, $addr", []>,
|
||||
T1LdStSP<{1,?,?}> {
|
||||
bits<3> Rt;
|
||||
bits<8> addr;
|
||||
let Inst{10-8} = Rt;
|
||||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
// Load tconstpool
|
||||
// FIXME: Use ldr.n to work around a Darwin assembler bug.
|
||||
let canFoldAsLoad = 1, isReMaterializable = 1 in
|
||||
|
@ -755,19 +742,6 @@ def tSTRspi : T1pIs<(outs), (ins tGPR:$Rt, t_addrmode_sp:$addr), IIC_iStore_i,
|
|||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
let mayStore = 1, neverHasSideEffects = 1 in
|
||||
// Special instruction for spill. It cannot clobber condition register when it's
|
||||
// expanded by eliminateCallFramePseudoInstr().
|
||||
// FIXME: Pseudo for tSTRspi
|
||||
def tSpill : T1pIs<(outs), (ins tGPR:$src, t_addrmode_sp:$addr), IIC_iStore_i,
|
||||
"str", "\t$src, $addr", []>,
|
||||
T1LdStSP<{0,?,?}> {
|
||||
bits<3> Rt;
|
||||
bits<8> addr;
|
||||
let Inst{10-8} = Rt;
|
||||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Load / store multiple Instructions.
|
||||
//
|
||||
|
|
|
@ -177,7 +177,7 @@ static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) {
|
|||
}
|
||||
|
||||
static bool isCSRestore(MachineInstr *MI, const unsigned *CSRegs) {
|
||||
if (MI->getOpcode() == ARM::tRestore &&
|
||||
if (MI->getOpcode() == ARM::tLDRspi &&
|
||||
MI->getOperand(1).isFI() &&
|
||||
isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs))
|
||||
return true;
|
||||
|
|
|
@ -75,7 +75,7 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
|||
MachineMemOperand::MOStore,
|
||||
MFI.getObjectSize(FI),
|
||||
MFI.getObjectAlignment(FI));
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tSpill))
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tSTRspi))
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addFrameIndex(FI).addImm(0).addMemOperand(MMO));
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
|||
MachineMemOperand::MOLoad,
|
||||
MFI.getObjectSize(FI),
|
||||
MFI.getObjectAlignment(FI));
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tRestore), DestReg)
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tLDRspi), DestReg)
|
||||
.addFrameIndex(FI).addImm(0).addMemOperand(MMO));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -377,11 +377,9 @@ static void removeOperands(MachineInstr &MI, unsigned i) {
|
|||
static unsigned convertToNonSPOpcode(unsigned Opcode) {
|
||||
switch (Opcode) {
|
||||
case ARM::tLDRspi:
|
||||
case ARM::tRestore: // FIXME: Should this opcode be here?
|
||||
return ARM::tLDRi;
|
||||
|
||||
case ARM::tSTRspi:
|
||||
case ARM::tSpill: // FIXME: Should this opcode be here?
|
||||
return ARM::tSTRi;
|
||||
}
|
||||
|
||||
|
@ -524,7 +522,7 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
|
|||
|
||||
// If this is a thumb spill / restore, we will be using a constpool load to
|
||||
// materialize the offset.
|
||||
if (Opcode == ARM::tRestore || Opcode == ARM::tSpill) {
|
||||
if (Opcode == ARM::tLDRspi || Opcode == ARM::tSTRspi) {
|
||||
ImmOp.ChangeToImmediate(0);
|
||||
} else {
|
||||
// Otherwise, it didn't fit. Pull in what we can to simplify the immed.
|
||||
|
@ -664,7 +662,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
|||
// Use the destination register to materialize sp + offset.
|
||||
unsigned TmpReg = MI.getOperand(0).getReg();
|
||||
bool UseRR = false;
|
||||
if (Opcode == ARM::tRestore) {
|
||||
if (Opcode == ARM::tLDRspi) {
|
||||
if (FrameReg == ARM::SP)
|
||||
emitThumbRegPlusImmInReg(MBB, II, dl, TmpReg, FrameReg,
|
||||
Offset, false, TII, *this);
|
||||
|
@ -687,7 +685,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
|||
VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
|
||||
bool UseRR = false;
|
||||
|
||||
if (Opcode == ARM::tSpill) {
|
||||
if (Opcode == ARM::tSTRspi) {
|
||||
if (FrameReg == ARM::SP)
|
||||
emitThumbRegPlusImmInReg(MBB, II, dl, VReg, FrameReg,
|
||||
Offset, false, TII, *this);
|
||||
|
|
|
@ -1667,14 +1667,12 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
|
|||
// tPOP_RET/t2LDMIA_RET conflict with tPOP/t2LDM (ditto)
|
||||
// tMOVCCi conflicts with tMOVi8
|
||||
// tMOVCCr conflicts with tMOVgpr2gpr
|
||||
// tSpill conflicts with tSTRspi
|
||||
// tLDRcp conflicts with tLDRspi
|
||||
// tRestore conflicts with tLDRspi
|
||||
// t2MOVCCi16 conflicts with tMOVi16
|
||||
if (Name == "tBfar" ||
|
||||
Name == "tPOP_RET" || Name == "t2LDMIA_RET" ||
|
||||
Name == "tMOVCCi" || Name == "tMOVCCr" ||
|
||||
Name == "tSpill" || Name == "tLDRcp" || Name == "tRestore" ||
|
||||
Name == "tLDRcp" ||
|
||||
Name == "t2MOVCCi16")
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue