Adding kill info to val#.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 8 Aug 2007 07:03:29 +0000 (07:03 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 8 Aug 2007 07:03:29 +0000 (07:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40925 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveInterval.h
lib/CodeGen/LiveIntervalAnalysis.cpp

index 71daf611f60890401190ee260cf9a4a4f551942f..e8378f2bcd1d8ad5d3ed02c0ef37cf2a3b3f8027 100644 (file)
@@ -166,8 +166,23 @@ namespace llvm {
     /// addKillForValNum - Add a kill instruction index to the specified value
     /// number.
     void addKillForValNum(unsigned ValNo, unsigned KillIdx) {
+      assert(ValNo < ValueNumberInfo.size());
       ValueNumberInfo[ValNo].kills.push_back(KillIdx);
     }
+
+    /// replaceKillForValNum - Replace a kill index of the specified value with
+    /// a new kill index.
+    bool replaceKillForValNum(unsigned ValNo, unsigned OldKill,
+                              unsigned NewKill) {
+      SmallVector<unsigned, 4> kills = ValueNumberInfo[ValNo].kills;
+      SmallVector<unsigned, 4>::iterator I =
+        std::find(kills.begin(), kills.end(), OldKill);
+      if (I == kills.end())
+        return false;
+      kills.erase(I);
+      kills.push_back(NewKill);
+      return true;
+    }
     
     VNInfo getValNumInfo(unsigned ValNo) const {
       assert(ValNo < ValueNumberInfo.size());
index c286a1a09dba2bacb6334e208c8e87f19250df4f..aac6686a10b89ff6811377cb0b6d5b3bca3e1811 100644 (file)
@@ -457,6 +457,7 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
       LiveRange LR(DefIndex, RedefIndex, ValNo);
       DOUT << " replace range with " << LR;
       interval.addRange(LR);
+      interval.addKillForValNum(ValNo, RedefIndex);
 
       // If this redefinition is dead, we need to add a dummy unit live
       // range covering the def slot.
@@ -481,6 +482,8 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
         DOUT << " Removing [" << Start << "," << End << "] from: ";
         interval.print(DOUT, mri_); DOUT << "\n";
         interval.removeRange(Start, End);
+        bool replaced = interval.replaceKillForValNum(0, End, Start);
+        assert(replaced && "Incorrect kill info?");
         DOUT << " RESULT: "; interval.print(DOUT, mri_);
 
         // Replace the interval with one of a NEW value number.  Note that this
@@ -488,6 +491,7 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
         LiveRange LR(Start, End, interval.getNextValue(~0, 0));
         DOUT << " replace range with " << LR;
         interval.addRange(LR);
+        interval.addKillForValNum(LR.ValId, End);
         DOUT << " RESULT: "; interval.print(DOUT, mri_);
       }
 
@@ -503,9 +507,10 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
       else
         ValNum = interval.getNextValue(defIndex, SrcReg);
       
-      LiveRange LR(defIndex,
-                   getInstructionIndex(&mbb->back()) + InstrSlots::NUM, ValNum);
+      unsigned killIndex = getInstructionIndex(&mbb->back()) + InstrSlots::NUM;
+      LiveRange LR(defIndex, killIndex, ValNum);
       interval.addRange(LR);
+      interval.addKillForValNum(ValNum, killIndex);
       DOUT << " +" << LR;
     }
   }
@@ -570,6 +575,7 @@ exit:
     ? OldLR->ValId : interval.getNextValue(start, SrcReg);
   LiveRange LR(start, end, Id);
   interval.addRange(LR);
+  interval.addKillForValNum(LR.ValId, end);
   DOUT << " +" << LR << '\n';
 }
 
@@ -635,8 +641,9 @@ exit:
   }
 
   LiveRange LR(start, end, interval.getNextValue(start, 0));
-  DOUT << " +" << LR << '\n';
   interval.addRange(LR);
+  interval.addKillForValNum(LR.ValId, end);
+  DOUT << " +" << LR << '\n';
 }
 
 /// computeIntervals - computes the live intervals for virtual