aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/PreAllocSplitting.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp
index 4dc8b82972..1180dee7b7 100644
--- a/lib/CodeGen/PreAllocSplitting.cpp
+++ b/lib/CodeGen/PreAllocSplitting.cpp
@@ -50,6 +50,7 @@ namespace {
MachineFunction *CurrMF;
const TargetMachine *TM;
const TargetInstrInfo *TII;
+ const TargetRegisterInfo* TRI;
MachineFrameInfo *MFI;
MachineRegisterInfo *MRI;
LiveIntervals *LIs;
@@ -223,12 +224,21 @@ PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI,
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 @@ PreAllocSplitting::findRestorePoint(MachineBasicBlock *MBB, MachineInstr *MI,
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::createsNewJoin(LiveRange* LR,
bool PreAllocSplitting::runOnMachineFunction(MachineFunction &MF) {
CurrMF = &MF;
TM = &MF.getTarget();
+ TRI = TM->getRegisterInfo();
TII = TM->getInstrInfo();
MFI = MF.getFrameInfo();
MRI = &MF.getRegInfo();