OSDN Git Service

Fix up kill/dead marking in the new live interval reconstruction code.
authorOwen Anderson <resistor@mac.com>
Sun, 28 Dec 2008 23:35:13 +0000 (23:35 +0000)
committerOwen Anderson <resistor@mac.com>
Sun, 28 Dec 2008 23:35:13 +0000 (23:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61460 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/PreAllocSplitting.cpp

index 0880f62..3f303ae 100644 (file)
@@ -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