diff options
author | Owen Anderson <resistor@mac.com> | 2009-01-29 22:13:06 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-01-29 22:13:06 +0000 |
commit | 3ef4549d9d03146a23971f44155eca6330fb308e (patch) | |
tree | c2c56ec68e164f8fe40ffbf938846ae5af1d4d8a /lib/CodeGen/PreAllocSplitting.cpp | |
parent | 15b3830bcda4f9958abf1c65e6e1c64c5cbb484d (diff) |
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
Diffstat (limited to 'lib/CodeGen/PreAllocSplitting.cpp')
-rw-r--r-- | lib/CodeGen/PreAllocSplitting.cpp | 25 |
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(); |