diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-10-28 05:28:21 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-10-28 05:28:21 +0000 |
commit | 1f08cc2d2bc0c9369ecb0e3f90cce7c362c3924e (patch) | |
tree | a1b91a8401697b7f8f4c5eea8beb653f5478d92f | |
parent | ae7fa5bef1bd8ff4cee120dae2e4388184410ad2 (diff) |
If def is in the same mbb as the barrier, spilt the value after the last use before the barrier.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58314 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/PreAllocSplitting.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index b6efe0624d..a45f7fcdfc 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -107,7 +107,7 @@ namespace { unsigned&); MachineBasicBlock::iterator - findSpillPoint(MachineBasicBlock*, MachineInstr*, + findSpillPoint(MachineBasicBlock*, MachineInstr*, MachineInstr*, SmallPtrSet<MachineInstr*, 4>&, unsigned&); MachineBasicBlock::iterator @@ -166,12 +166,13 @@ PreAllocSplitting::findNextEmptySlot(MachineBasicBlock *MBB, MachineInstr *MI, /// none is found. MachineBasicBlock::iterator PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI, + MachineInstr *DefMI, SmallPtrSet<MachineInstr*, 4> &RefsInMBB, unsigned &SpillIndex) { MachineBasicBlock::iterator Pt = MBB->begin(); // Go top down if RefsInMBB is empty. - if (RefsInMBB.empty()) { + if (RefsInMBB.empty() && !DefMI) { MachineBasicBlock::iterator MII = MBB->begin(); MachineBasicBlock::iterator EndPt = MI; do { @@ -186,7 +187,9 @@ PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI, } while (MII != EndPt); } else { MachineBasicBlock::iterator MII = MI; - while (MII != MBB->begin() && !RefsInMBB.count(MII)) { + MachineBasicBlock::iterator EndPt = DefMI + ? MachineBasicBlock::iterator(DefMI) : MBB->begin(); + while (MII != EndPt && !RefsInMBB.count(MII)) { unsigned Index = LIs->getInstructionIndex(MII); if (LIs->hasGapBeforeInstr(Index)) { Pt = MII; @@ -561,7 +564,7 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) { if (ValNo->def == ~0U) { // If it's defined by a phi, we must split just before the barrier. MachineBasicBlock::iterator SpillPt = - findSpillPoint(BarrierMBB, Barrier, RefsInMBB, SpillIndex); + findSpillPoint(BarrierMBB, Barrier, NULL, RefsInMBB, SpillIndex); if (SpillPt == BarrierMBB->begin()) return false; // No gap to insert spill. // Add spill. @@ -578,10 +581,17 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) { // If it's already split, just restore the value. There is no need to spill // the def again. // Check if it's possible to insert a spill after the def MI. - MachineBasicBlock::iterator SpillPt = - findNextEmptySlot(DefMBB, DefMI, SpillIndex); - if (SpillPt == DefMBB->end()) - return false; // No gap to insert spill. + MachineBasicBlock::iterator SpillPt; + if (DefMBB == BarrierMBB) { + // Add spill after the def and the last use before the barrier. + SpillPt = findSpillPoint(BarrierMBB, Barrier, DefMI, RefsInMBB, SpillIndex); + if (SpillPt == DefMBB->begin()) + return false; // No gap to insert spill. + } else { + SpillPt = findNextEmptySlot(DefMBB, DefMI, SpillIndex); + if (SpillPt == DefMBB->end()) + return false; // No gap to insert spill. + } SS = MFI->CreateStackObject(RC->getSize(), RC->getAlignment()); // Add spill. The store instruction kills the register if def is before |