Correct the algorithms for choosing spill and restore points so that we don't try to insert loads/stores between call frame setup and the actual call.
This fixes the last known failure for the pre-alloc-splitter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63339 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp
index 4dc8b82..1180dee 100644
--- a/lib/CodeGen/PreAllocSplitting.cpp
+++ b/lib/CodeGen/PreAllocSplitting.cpp
@@ -50,6 +50,7 @@
MachineFunction *CurrMF;
const TargetMachine *TM;
const TargetInstrInfo *TII;
+ const TargetRegisterInfo* TRI;
MachineFrameInfo *MFI;
MachineRegisterInfo *MRI;
LiveIntervals *LIs;
@@ -223,12 +224,21 @@
Pt = MII;
SpillIndex = Gap;
break;
- }
+
+ // We can't insert the spill between the barrier (a call), and its
+ // corresponding call frame setup.
+ } else if (prior(MII)->getOpcode() == TRI->getCallFrameSetupOpcode() &&
+ MII == MachineBasicBlock::iterator(MI))
+ break;
} while (MII != EndPt);
} else {
MachineBasicBlock::iterator MII = MI;
MachineBasicBlock::iterator EndPt = DefMI
? MachineBasicBlock::iterator(DefMI) : MBB->begin();
+
+ // We can't insert the spill between the barrier (a call), and its
+ // corresponding call frame setup.
+ if (prior(MII)->getOpcode() == TRI->getCallFrameSetupOpcode()) --MII;
while (MII != EndPt && !RefsInMBB.count(MII)) {
unsigned Index = LIs->getInstructionIndex(MII);
if (LIs->hasGapBeforeInstr(Index)) {
@@ -269,12 +279,22 @@
Pt = MII;
RestoreIndex = Gap;
break;
- }
+
+ // We can't insert a restore between the barrier (a call) and its
+ // corresponding call frame teardown.
+ } else if (MII->getOpcode() == TRI->getCallFrameDestroyOpcode() &&
+ prior(MII) == MachineBasicBlock::iterator(MI))
+ break;
--MII;
} while (MII != EndPt);
} else {
MachineBasicBlock::iterator MII = MI;
MII = ++MII;
+ // We can't insert a restore between the barrier (a call) and its
+ // corresponding call frame teardown.
+ if (MII->getOpcode() == TRI->getCallFrameDestroyOpcode())
+ ++MII;
+
// FIXME: Limit the number of instructions to examine to reduce
// compile time?
while (MII != MBB->getFirstTerminator()) {
@@ -1291,6 +1311,7 @@
bool PreAllocSplitting::runOnMachineFunction(MachineFunction &MF) {
CurrMF = &MF;
TM = &MF.getTarget();
+ TRI = TM->getRegisterInfo();
TII = TM->getInstrInfo();
MFI = MF.getFrameInfo();
MRI = &MF.getRegInfo();