[llvm-commits] [llvm] r54070 - /llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp

Owen Anderson resistor at mac.com
Fri Jul 25 15:32:01 PDT 2008


Author: resistor
Date: Fri Jul 25 17:32:01 2008
New Revision: 54070

URL: http://llvm.org/viewvc/llvm-project?rev=54070&view=rev
Log:
Special cases are needed in renumbering when dealing with renumbering after a PHI has been removed.  The interval previously defined
by the PHI needs to be extended to the beginning of its basic block, and the intervals that were inputs need to be trimmed to the end 
of their basic blocks.

Modified:
    llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp

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

==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Fri Jul 25 17:32:01 2008
@@ -126,6 +126,7 @@
     MBB2IdxMap[MBB->getNumber()] = std::make_pair(StartIdx, MIIndex - 1);
     Idx2MBBMap.push_back(std::make_pair(StartIdx, MBB));
   }
+  
   std::sort(Idx2MBBMap.begin(), Idx2MBBMap.end(), Idx2MBBCompare());
   
   if (!OldI2MI.empty())
@@ -139,7 +140,7 @@
         // instruction or its predecessor.
         unsigned index = LI->start / InstrSlots::NUM;
         unsigned offset = LI->start % InstrSlots::NUM;
-        if (offset == InstrSlots::LOAD) {
+        if (offset == InstrSlots::LOAD || LI->valno->def == ~0U) {
           std::vector<IdxMBBPair>::const_iterator I =
                   std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), LI->start);
           // Take the pair containing the index
@@ -157,7 +158,30 @@
         // following instruction.
         index = (LI->end - 1) / InstrSlots::NUM;
         offset  = LI->end % InstrSlots::NUM;
-        if (offset == InstrSlots::USE) {
+        if (LI->valno->hasPHIKill && !OldI2MI[index]) {
+          // Special handling for when this was previously killed by a PHI, but
+          // the PHI has now been removed.  We need to trim the live interval
+          // to die at the end of the preceding block.
+          std::vector<IdxMBBPair>::const_iterator I =
+                  std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), LI->end);
+          // Take the pair containing the index
+          std::vector<IdxMBBPair>::const_iterator J =
+                    ((I != OldI2MBB.end() && I->first > index) ||
+                    (I == OldI2MBB.end() && OldI2MBB.size()>0)) ? (I-1): I;
+          
+          MachineBasicBlock* StartMBB = J->second;
+          MachineBasicBlock* CurrMBB = J->second;
+          
+          while (CurrMBB == StartMBB) {
+            while (index > 0 && !OldI2MI[index]) --index;
+            CurrMBB = OldI2MI[index]->getParent();
+            if (!StartMBB) StartMBB = CurrMBB;
+            
+            --index;
+          }
+          
+          LI->end = getMBBEndIdx(CurrMBB) + 1;
+        } else if (offset == InstrSlots::USE) {
           std::vector<IdxMBBPair>::const_iterator I =
                   std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), LI->end);
           // Take the pair containing the index
@@ -179,20 +203,23 @@
         // Remap the VNInfo def index, which works the same as the
         // start indices above.
         VNInfo* vni = LI->valno;
-        index = vni->def / InstrSlots::NUM;
-        offset = vni->def % InstrSlots::NUM;
-        if (offset == InstrSlots::LOAD) {
-          std::vector<IdxMBBPair>::const_iterator I =
-                  std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), vni->def);
-          // Take the pair containing the index
-          std::vector<IdxMBBPair>::const_iterator J =
-                    ((I != OldI2MBB.end() && I->first > index) ||
-                    (I == OldI2MBB.end() && OldI2MBB.size()>0)) ? (I-1): I;
+        if (vni->def != ~0U) {
+          index = vni->def / InstrSlots::NUM;
+          offset = vni->def % InstrSlots::NUM;
+          if (offset == InstrSlots::LOAD) {
+            std::vector<IdxMBBPair>::const_iterator I =
+                    std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), 
+                                     vni->def);
+            // Take the pair containing the index
+            std::vector<IdxMBBPair>::const_iterator J =
+                      ((I != OldI2MBB.end() && I->first > index) ||
+                      (I == OldI2MBB.end() && OldI2MBB.size()>0)) ? (I-1): I;
           
-          vni->def = getMBBStartIdx(J->second);
+            vni->def = getMBBStartIdx(J->second);
           
-        } else {
-          vni->def = mi2iMap_[OldI2MI[index]] + offset;
+          } else {
+            vni->def = mi2iMap_[OldI2MI[index]] + offset;
+          }
         }
         
         // Remap the VNInfo kill indices, which works the same as
@@ -200,7 +227,31 @@
         for (size_t i = 0; i < vni->kills.size(); ++i) {
           index = (vni->kills[i]-1) / InstrSlots::NUM;
           offset = vni->kills[i] % InstrSlots::NUM;
-          if (offset == InstrSlots::USE) {
+          
+          if (LI->valno->hasPHIKill && !OldI2MI[index]) {
+            // Special handling for when this was previously killed by a PHI,
+            // but the PHI has now been removed.  We need to trim the live
+            // interval to die at the end of the preceding block.
+            std::vector<IdxMBBPair>::const_iterator I =
+                    std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), LI->end);
+            // Take the pair containing the index
+            std::vector<IdxMBBPair>::const_iterator J =
+                      ((I != OldI2MBB.end() && I->first > index) ||
+                      (I == OldI2MBB.end() && OldI2MBB.size()>0)) ? (I-1): I;
+
+            MachineBasicBlock* StartMBB = J->second;
+            MachineBasicBlock* CurrMBB = J->second;
+
+            while (CurrMBB == StartMBB) {
+              while (index > 0 && !OldI2MI[index]) --index;
+              CurrMBB = OldI2MI[index]->getParent();
+              if (!StartMBB) StartMBB = CurrMBB;
+
+              --index;
+            }
+
+            vni->kills[i] = getMBBEndIdx(CurrMBB) + 1;
+          } else if (offset == InstrSlots::USE) {
             std::vector<IdxMBBPair>::const_iterator I =
              std::lower_bound(OldI2MBB.begin(), OldI2MBB.end(), vni->kills[i]);
             // Take the pair containing the index





More information about the llvm-commits mailing list