diff options
Diffstat (limited to 'lib/CodeGen/PreAllocSplitting.cpp')
-rw-r--r-- | lib/CodeGen/PreAllocSplitting.cpp | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index 0880f62297..3f303ae098 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -722,10 +722,9 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction( NewVNs, Visited, false); // FIXME: Need to set kills properly for inter-block stuff. - if (toplevel) { - if (LI->isKill(ret, UseIndex)) LI->removeKill(ret, UseIndex); + if (LI->isKill(ret, UseIndex)) LI->removeKill(ret, UseIndex); + if (toplevel) LI->addKill(ret, EndIndex); - } LI->addRange(LiveRange(UseIndex, EndIndex, ret)); } else if (ContainsDefs && ContainsUses){ @@ -778,10 +777,9 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction( ret = PerformPHIConstruction(walker, LI, Defs, Uses, NewVNs, Visited, false); - // FIXME: Need to set kills properly for inter-block stuff. + if (foundUse && LI->isKill(ret, StartIndex)) + LI->removeKill(ret, StartIndex); if (toplevel) { - if (foundUse && LI->isKill(ret, StartIndex)) - LI->removeKill(ret, StartIndex); LI->addKill(ret, EndIndex); } @@ -834,6 +832,20 @@ void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) { DenseMap<MachineBasicBlock*, VNInfo*> Visited; PerformPHIConstruction(&*UI, LI, Defs, Uses, NewVNs, Visited, true); } + + // Add ranges for dead defs + for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(LI->reg), + DE = MRI->def_end(); DI != DE; ++DI) { + unsigned DefIdx = LIs->getInstructionIndex(&*DI); + DefIdx = LiveIntervals::getDefIndex(DefIdx); + unsigned UseIdx = LiveIntervals::getUseIndex(DefIdx); + + if (LI->liveAt(DefIdx)) continue; + + VNInfo* DeadVN = NewVNs[&*DI]; + LI->addRange(LiveRange(DefIdx, UseIdx, DeadVN)); + LI->addKill(DeadVN, DefIdx); + } } /// ShrinkWrapLiveInterval - Recursively traverse the predecessor |