[llvm-commits] [llvm] r40916 - in /llvm/trunk: include/llvm/CodeGen/LiveInterval.h lib/CodeGen/LiveInterval.cpp lib/CodeGen/LiveIntervalAnalysis.cpp lib/CodeGen/SimpleRegisterCoalescing.cpp

Evan Cheng evan.cheng at apple.com
Tue Aug 7 20:00:28 PDT 2007


Author: evancheng
Date: Tue Aug  7 22:00:28 2007
New Revision: 40916

URL: http://llvm.org/viewvc/llvm-project?rev=40916&view=rev
Log:
- Each val# can have multiple kills.
- Fix some minor bugs related to special markers on val# def. ~0U means
  undefined, ~1U means dead val#.

Modified:
    llvm/trunk/include/llvm/CodeGen/LiveInterval.h
    llvm/trunk/lib/CodeGen/LiveInterval.cpp
    llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
    llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp

Modified: llvm/trunk/include/llvm/CodeGen/LiveInterval.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveInterval.h?rev=40916&r1=40915&r2=40916&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/LiveInterval.h (original)
+++ llvm/trunk/include/llvm/CodeGen/LiveInterval.h Tue Aug  7 22:00:28 2007
@@ -87,17 +87,14 @@
     Ranges ranges;       // the ranges in which this register is live
 
     /// ValueNumberInfo - If the value number definition is undefined (e.g. phi
-    /// merge point), it contains ~0,x,x. If the value number is not in use, it
-    /// contains ~1,x,x to indicate that the value # is not used. The first
-    /// entry is the instruction # of the definition, the second is the kill #.
-    /// If the third value is non-zero, then the val# is defined by a copy and
-    /// it represents the register number it is copied from.
+    /// merge point), it contains ~0u,x. If the value number is not in use, it
+    /// contains ~1u,x to indicate that the value # is not used. 
     struct VNInfo {
-      unsigned def;
-      unsigned kill;
-      unsigned reg;
-      VNInfo() : def(~1U), kill(~0U), reg(0) {};
-      VNInfo(unsigned d, unsigned k, unsigned r) : def(d), kill(k), reg(r) {};
+      unsigned def;  // instruction # of the definition
+      unsigned reg;  // src reg: non-zero iff val# is defined by a copy
+      SmallVector<unsigned, 4> kills;  // instruction #s of the kills
+      VNInfo() : def(~1U), reg(0) {};
+      VNInfo(unsigned d, unsigned r) : def(d), reg(r) {};
     };
   private:
     SmallVector<VNInfo, 4> ValueNumberInfo;
@@ -143,7 +140,7 @@
     /// getNextValue - Create a new value number and return it.  MIIdx specifies
     /// the instruction that defines the value number.
     unsigned getNextValue(unsigned MIIdx, unsigned SrcReg) {
-      ValueNumberInfo.push_back(VNInfo(MIIdx, ~0U, SrcReg));
+      ValueNumberInfo.push_back(VNInfo(MIIdx, SrcReg));
       return ValueNumberInfo.size()-1;
     }
     
@@ -154,16 +151,22 @@
       return ValueNumberInfo[ValNo].def;
     }
     
-    /// getKillForValNum - Return the machine instruction index that kills the
-    /// specified value number.
-    unsigned getKillForValNum(unsigned ValNo) const {
+    unsigned getSrcRegForValNum(unsigned ValNo) const {
       //assert(ValNo < ValueNumberInfo.size());
-      return ValueNumberInfo[ValNo].kill;
+      return ValueNumberInfo[ValNo].reg;
     }
     
-    unsigned getSrcRegForValNum(unsigned ValNo) const {
+    /// getKillsForValNum - Return the kill instruction indexes of the specified
+    /// value number.
+    SmallVector<unsigned, 4> getKillsForValNum(unsigned ValNo) const {
       //assert(ValNo < ValueNumberInfo.size());
-      return ValueNumberInfo[ValNo].reg;
+      return ValueNumberInfo[ValNo].kills;
+    }
+    
+    /// addKillForValNum - Add a kill instruction index to the specified value
+    /// number.
+    void addKillForValNum(unsigned ValNo, unsigned KillIdx) {
+      ValueNumberInfo[ValNo].kills.push_back(KillIdx);
     }
     
     VNInfo getValNumInfo(unsigned ValNo) const {
@@ -176,7 +179,7 @@
     void setValueNumberInfo(unsigned ValNo, const VNInfo &I) {
       ValueNumberInfo[ValNo] = I;
     }
-    
+
     /// MergeValueNumberInto - This method is called when two value nubmers
     /// are found to be equivalent.  This eliminates V1, replacing all
     /// LiveRanges with the V1 value number with the V2 value number.  This can

Modified: llvm/trunk/lib/CodeGen/LiveInterval.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveInterval.cpp?rev=40916&r1=40915&r2=40916&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/LiveInterval.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveInterval.cpp Tue Aug  7 22:00:28 2007
@@ -300,7 +300,7 @@
   // we want to avoid the interval scan if not.
   bool MustMapCurValNos = false;
   for (unsigned i = 0, e = getNumValNums(); i != e; ++i) {
-    if (ValueNumberInfo[i].def == ~1U) continue;  // tombstone value #
+    //if (ValueNumberInfo[i].def == ~1U) continue;  // tombstone value #
     if (i != (unsigned)LHSValNoAssignments[i]) {
       MustMapCurValNos = true;
       break;
@@ -508,14 +508,11 @@
       OS << i << "@";
       if (ValueNumberInfo[i].def == ~0U) {
         OS << "?";
+      } else if (ValueNumberInfo[i].def == ~1U) {
+        OS << "x";
       } else {
         OS << ValueNumberInfo[i].def;
       }
-      if (ValueNumberInfo[i].kill == ~0U) {
-        OS << ",?";
-      } else {
-        OS << "," << ValueNumberInfo[i].kill;
-      }
     }
   }
 }

Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=40916&r1=40915&r2=40916&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Tue Aug  7 22:00:28 2007
@@ -347,7 +347,6 @@
 
     // Get the Idx of the defining instructions.
     unsigned defIndex = getDefIndex(MIIdx);
-
     unsigned ValNum;
     unsigned SrcReg, DstReg;
     if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
@@ -378,6 +377,7 @@
         LiveRange LR(defIndex, killIdx, ValNum);
         interval.addRange(LR);
         DOUT << " +" << LR << "\n";
+        interval.addKillForValNum(ValNum, killIdx);
         return;
       }
     }
@@ -412,10 +412,11 @@
     // block to the 'use' slot of the killing instruction.
     for (unsigned i = 0, e = vi.Kills.size(); i != e; ++i) {
       MachineInstr *Kill = vi.Kills[i];
+      unsigned killIdx = getUseIndex(getInstructionIndex(Kill))+1;
       LiveRange LR(getMBBStartIdx(Kill->getParent()),
-                   getUseIndex(getInstructionIndex(Kill))+1,
-                   ValNum);
+                   killIdx, ValNum);
       interval.addRange(LR);
+      interval.addKillForValNum(ValNum, killIdx);
       DOUT << " +" << LR;
     }
 
@@ -450,7 +451,7 @@
       interval.setValueNumberInfo(1, interval.getValNumInfo(0));
       
       // Value#0 is now defined by the 2-addr instruction.
-      interval.setValueNumberInfo(0, LiveInterval::VNInfo(DefIndex, ~0U, 0U));
+      interval.setValueNumberInfo(0, LiveInterval::VNInfo(DefIndex, 0U));
       
       // Add the new live interval which replaces the range for the input copy.
       LiveRange LR(DefIndex, RedefIndex, ValNo);

Modified: llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp?rev=40916&r1=40915&r2=40916&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp (original)
+++ llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp Tue Aug  7 22:00:28 2007
@@ -132,7 +132,7 @@
   // We are about to delete CopyMI, so need to remove it as the 'instruction
   // that defines this value #'. Update the the valnum with the new defining
   // instruction #.
-  IntB.setValueNumberInfo(BValNo, LiveInterval::VNInfo(FillerStart, ~0U, 0));
+  IntB.setValueNumberInfo(BValNo, LiveInterval::VNInfo(FillerStart, 0));
   
   // Okay, we can merge them.  We need to insert a new liverange:
   // [ValLR.end, BLR.begin) of either value number, then we merge the
@@ -645,7 +645,7 @@
           // Otherwise, use the specified value #.
           LHSValNoAssignments[VN] = RHSValID;
           if (VN != (unsigned)RHSValID)
-            ValueNumberInfo[VN].def = ~1U;
+            ValueNumberInfo[VN].def = RHSValNoInfo.def;
           else
             ValueNumberInfo[VN] = RHSValNoInfo;
         }





More information about the llvm-commits mailing list