[llvm-commits] [llvm] r63025 - /llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp
Owen Anderson
resistor at mac.com
Mon Jan 26 11:12:07 PST 2009
Author: resistor
Date: Mon Jan 26 13:12:06 2009
New Revision: 63025
URL: http://llvm.org/viewvc/llvm-project?rev=63025&view=rev
Log:
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.
Modified:
llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp
Modified: llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp?rev=63025&r1=63024&r2=63025&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp (original)
+++ llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp Mon Jan 26 13:12:06 2009
@@ -748,12 +748,12 @@
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 @@
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 @@
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 @@
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;
More information about the llvm-commits
mailing list