mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
Mark all PPC CR registers to be spilled as live-in and tag MFCR appropriately
Leaving MFCR has having unmodeled side effects is not enough to prevent unwanted instruction reordering post-RA. We could probably apply a stronger barrier attribute, but there is a better way: Add all (not just the first) CR to be spilled as live-in to the entry block, and add all CRs to the MFCR instruction as implicitly killed. Unfortunately, I don't have a small test case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179465 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
41d59c6130
commit
63496f66c5
@ -1122,18 +1122,21 @@ PPCFrameLowering::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|||||||
*static_cast<const PPCInstrInfo*>(MF->getTarget().getInstrInfo());
|
*static_cast<const PPCInstrInfo*>(MF->getTarget().getInstrInfo());
|
||||||
DebugLoc DL;
|
DebugLoc DL;
|
||||||
bool CRSpilled = false;
|
bool CRSpilled = false;
|
||||||
|
MachineInstrBuilder CRMIB;
|
||||||
|
|
||||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
||||||
unsigned Reg = CSI[i].getReg();
|
unsigned Reg = CSI[i].getReg();
|
||||||
// CR2 through CR4 are the nonvolatile CR fields.
|
// CR2 through CR4 are the nonvolatile CR fields.
|
||||||
bool IsCRField = PPC::CR2 <= Reg && Reg <= PPC::CR4;
|
bool IsCRField = PPC::CR2 <= Reg && Reg <= PPC::CR4;
|
||||||
|
|
||||||
if (CRSpilled && IsCRField)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Add the callee-saved register as live-in; it's killed at the spill.
|
// Add the callee-saved register as live-in; it's killed at the spill.
|
||||||
MBB.addLiveIn(Reg);
|
MBB.addLiveIn(Reg);
|
||||||
|
|
||||||
|
if (CRSpilled && IsCRField) {
|
||||||
|
CRMIB.addReg(Reg, RegState::ImplicitKill);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Insert the spill to the stack frame.
|
// Insert the spill to the stack frame.
|
||||||
if (IsCRField) {
|
if (IsCRField) {
|
||||||
CRSpilled = true;
|
CRSpilled = true;
|
||||||
@ -1143,7 +1146,10 @@ PPCFrameLowering::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|||||||
// 64-bit: SP+8
|
// 64-bit: SP+8
|
||||||
bool is31 = needsFP(*MF);
|
bool is31 = needsFP(*MF);
|
||||||
unsigned FP8Reg = is31 ? PPC::X31 : PPC::X1;
|
unsigned FP8Reg = is31 ? PPC::X31 : PPC::X1;
|
||||||
MBB.insert(MI, BuildMI(*MF, DL, TII.get(PPC::MFCR8), PPC::X12));
|
CRMIB = BuildMI(*MF, DL, TII.get(PPC::MFCR8), PPC::X12)
|
||||||
|
.addReg(Reg, RegState::ImplicitKill);
|
||||||
|
|
||||||
|
MBB.insert(MI, CRMIB);
|
||||||
MBB.insert(MI, BuildMI(*MF, DL, TII.get(PPC::STW8))
|
MBB.insert(MI, BuildMI(*MF, DL, TII.get(PPC::STW8))
|
||||||
.addReg(PPC::X12,
|
.addReg(PPC::X12,
|
||||||
getKillRegState(true))
|
getKillRegState(true))
|
||||||
@ -1152,7 +1158,10 @@ PPCFrameLowering::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|||||||
} else {
|
} else {
|
||||||
// 32-bit: FP-relative. Note that we made sure CR2-CR4 all have
|
// 32-bit: FP-relative. Note that we made sure CR2-CR4 all have
|
||||||
// the same frame index in PPCRegisterInfo::hasReservedSpillSlot.
|
// the same frame index in PPCRegisterInfo::hasReservedSpillSlot.
|
||||||
MBB.insert(MI, BuildMI(*MF, DL, TII.get(PPC::MFCR), PPC::R12));
|
CRMIB = BuildMI(*MF, DL, TII.get(PPC::MFCR), PPC::R12)
|
||||||
|
.addReg(Reg, RegState::ImplicitKill);
|
||||||
|
|
||||||
|
MBB.insert(MI, CRMIB);
|
||||||
MBB.insert(MI, addFrameReference(BuildMI(*MF, DL, TII.get(PPC::STW))
|
MBB.insert(MI, addFrameReference(BuildMI(*MF, DL, TII.get(PPC::STW))
|
||||||
.addReg(PPC::R12,
|
.addReg(PPC::R12,
|
||||||
getKillRegState(true)),
|
getKillRegState(true)),
|
||||||
|
@ -256,11 +256,7 @@ def MFCR8pseud: XFXForm_3<31, 19, (outs G8RC:$rT), (ins crbitm:$FXM),
|
|||||||
PPC970_MicroCode, PPC970_Unit_CRU;
|
PPC970_MicroCode, PPC970_Unit_CRU;
|
||||||
} // neverHasSideEffects = 1
|
} // neverHasSideEffects = 1
|
||||||
|
|
||||||
// MFCR uses all CR registers, but marking that explicitly causes
|
let neverHasSideEffects = 1 in
|
||||||
// problems because some of them appear to be undefined. Because
|
|
||||||
// this form is used only in prologue code, just mark it as having
|
|
||||||
// side effects.
|
|
||||||
let /* Uses = [CR0, CR1, CR2, CR3, CR4, CR5, CR6] */ hasSideEffects = 1 in
|
|
||||||
def MFCR8 : XFXForm_3<31, 19, (outs G8RC:$rT), (ins),
|
def MFCR8 : XFXForm_3<31, 19, (outs G8RC:$rT), (ins),
|
||||||
"mfcr $rT", SprMFCR>,
|
"mfcr $rT", SprMFCR>,
|
||||||
PPC970_MicroCode, PPC970_Unit_CRU;
|
PPC970_MicroCode, PPC970_Unit_CRU;
|
||||||
|
@ -1618,11 +1618,7 @@ def MFOCRF: XFXForm_5a<31, 19, (outs GPRC:$rT), (ins crbitm:$FXM),
|
|||||||
PPC970_DGroup_First, PPC970_Unit_CRU;
|
PPC970_DGroup_First, PPC970_Unit_CRU;
|
||||||
} // neverHasSideEffects = 1
|
} // neverHasSideEffects = 1
|
||||||
|
|
||||||
// MFCR uses all CR registers, but marking that explicitly causes
|
let neverHasSideEffects = 1 in
|
||||||
// problems because some of them appear to be undefined. Because
|
|
||||||
// this form is used only in prologue code, just mark it as having
|
|
||||||
// side effects.
|
|
||||||
let /* Uses = [CR0, CR1, CR2, CR3, CR4, CR5, CR6] */ hasSideEffects = 1 in
|
|
||||||
def MFCR : XFXForm_3<31, 19, (outs GPRC:$rT), (ins),
|
def MFCR : XFXForm_3<31, 19, (outs GPRC:$rT), (ins),
|
||||||
"mfcr $rT", SprMFCR>,
|
"mfcr $rT", SprMFCR>,
|
||||||
PPC970_MicroCode, PPC970_Unit_CRU;
|
PPC970_MicroCode, PPC970_Unit_CRU;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user