summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-01-26 19:12:06 +0000
committerOwen Anderson <resistor@mac.com>2009-01-26 19:12:06 +0000
commitfeffdec2440bea5c82d4ecb4754f81c2175e6059 (patch)
treed10e7b2be42c8e06e5e91bbaf781d9c705655427 /llvm/lib
parent827c76305162f5a1e88a8a161381f54c4f6cb9e3 (diff)
downloadbcm5719-llvm-feffdec2440bea5c82d4ecb4754f81c2175e6059.tar.gz
bcm5719-llvm-feffdec2440bea5c82d4ecb4754f81c2175e6059.zip
Fix an issue where LiveIntervals was trying to be smart about removing kill
markers, and ended up foiling the interval reconstruction. This allows us to turn on reconstruction in the pre alloc splitter, which fixes a number of miscompilations. llvm-svn: 63025
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/PreAllocSplitting.cpp46
1 files changed, 12 insertions, 34 deletions
diff --git a/llvm/lib/CodeGen/PreAllocSplitting.cpp b/llvm/lib/CodeGen/PreAllocSplitting.cpp
index 16a9e6d9b04..0325f7cd02b 100644
--- a/llvm/lib/CodeGen/PreAllocSplitting.cpp
+++ b/llvm/lib/CodeGen/PreAllocSplitting.cpp
@@ -748,12 +748,12 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction(
ret = PerformPHIConstruction(walker, MBB, LI, Visited, Defs, Uses,
NewVNs, LiveOut, Phis, false, true);
+ LI->addRange(LiveRange(UseIndex, EndIndex+1, ret));
+
// FIXME: Need to set kills properly for inter-block stuff.
if (LI->isKill(ret, UseIndex)) LI->removeKill(ret, UseIndex);
if (intrablock)
LI->addKill(ret, EndIndex);
-
- LI->addRange(LiveRange(UseIndex, EndIndex+1, ret));
} else if (ContainsDefs && ContainsUses){
SmallPtrSet<MachineInstr*, 2>& BlockDefs = Defs[MBB];
SmallPtrSet<MachineInstr*, 2>& BlockUses = Uses[MBB];
@@ -805,13 +805,13 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction(
ret = PerformPHIConstruction(walker, MBB, LI, Visited, Defs, Uses,
NewVNs, LiveOut, Phis, false, true);
+ LI->addRange(LiveRange(StartIndex, EndIndex+1, ret));
+
if (foundUse && LI->isKill(ret, StartIndex))
LI->removeKill(ret, StartIndex);
if (intrablock) {
LI->addKill(ret, EndIndex);
}
-
- LI->addRange(LiveRange(StartIndex, EndIndex+1, ret));
}
// Memoize results so we don't have to recompute them.
@@ -1131,18 +1131,10 @@ bool PreAllocSplitting::Rematerialize(unsigned vreg, VNInfo* ValNo,
TII->reMaterialize(MBB, RestorePt, vreg, DefMI);
LIs->InsertMachineInstrInMaps(prior(RestorePt), RestoreIdx);
- if (KillPt->getParent() == BarrierMBB) {
- VNInfo* After = UpdateRegisterInterval(ValNo, LIs->getUseIndex(KillIdx)+1,
- LIs->getDefIndex(RestoreIdx));
-
- RenumberValno(After);
-
- ++NumSplits;
- ++NumRemats;
- return true;
- }
-
- RepairLiveInterval(CurrLI, ValNo, DefMI, RestoreIdx);
+ ReconstructLiveInterval(CurrLI);
+ unsigned RematIdx = LIs->getInstructionIndex(prior(RestorePt));
+ RematIdx = LiveIntervals::getDefIndex(RematIdx);
+ RenumberValno(CurrLI->findDefinedVNInfo(RematIdx));
++NumSplits;
++NumRemats;
@@ -1315,28 +1307,14 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
MachineInstr *LoadMI = prior(RestorePt);
LIs->InsertMachineInstrInMaps(LoadMI, RestoreIndex);
- // If live interval is spilled in the same block as the barrier, just
- // create a hole in the interval.
- if (!DefMBB ||
- (SpillMI && SpillMI->getParent() == BarrierMBB)) {
- // Update spill stack slot live interval.
- UpdateSpillSlotInterval(ValNo, LIs->getUseIndex(SpillIndex)+1,
- LIs->getDefIndex(RestoreIndex));
-
- VNInfo* After = UpdateRegisterInterval(ValNo,
- LIs->getUseIndex(SpillIndex)+1,
- LIs->getDefIndex(RestoreIndex));
- RenumberValno(After);
-
- ++NumSplits;
- return true;
- }
-
// Update spill stack slot live interval.
UpdateSpillSlotInterval(ValNo, LIs->getUseIndex(SpillIndex)+1,
LIs->getDefIndex(RestoreIndex));
- RepairLiveInterval(CurrLI, ValNo, DefMI, RestoreIndex);
+ ReconstructLiveInterval(CurrLI);
+ unsigned RestoreIdx = LIs->getInstructionIndex(prior(RestorePt));
+ RestoreIdx = LiveIntervals::getDefIndex(RestoreIdx);
+ RenumberValno(CurrLI->findDefinedVNInfo(RestoreIdx));
++NumSplits;
return true;
OpenPOWER on IntegriCloud