[llvm-commits] [llvm] r126911 - /llvm/trunk/lib/CodeGen/SplitKit.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Wed Mar 2 17:29:10 PST 2011


Author: stoklund
Date: Wed Mar  2 19:29:10 2011
New Revision: 126911

URL: http://llvm.org/viewvc/llvm-project?rev=126911&view=rev
Log:
Only run the updateSSA loop when we have actually seen multiple values.

When only a single value has been seen, new PHIDefs are never needed.

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

Modified: llvm/trunk/lib/CodeGen/SplitKit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.cpp?rev=126911&r1=126910&r2=126911&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SplitKit.cpp (original)
+++ llvm/trunk/lib/CodeGen/SplitKit.cpp Wed Mar  2 19:29:10 2011
@@ -313,6 +313,10 @@
   SmallVector<MachineDomTreeNode*, 16> LiveIn;
   LiveIn.push_back(MDT[IdxMBB]);
 
+  // Remember if we have seen more than one value.
+  bool UniqueVNI = true;
+  VNInfo *IdxVNI = 0;
+
   // Using LiveOutCache as a visited set, perform a BFS for all reaching defs.
   for (unsigned i = 0; i != LiveIn.size(); ++i) {
     MachineBasicBlock *MBB = LiveIn[i]->getBlock();
@@ -323,9 +327,14 @@
        std::pair<LiveOutMap::iterator,bool> LOIP =
          LiveOutCache.insert(std::make_pair(Pred, LiveOutPair()));
        // Yes, we have been here before.
-       if (!LOIP.second)
+       if (!LOIP.second) {
+         if (VNInfo *VNI = LOIP.first->second.first) {
+           if (IdxVNI && IdxVNI != VNI)
+             UniqueVNI = false;
+           IdxVNI = VNI;
+         }
          continue;
-
+       }
        // Does Pred provide a live-out value?
        SlotIndex Start, Last;
        tie(Start, Last) = LIS.getSlotIndexes()->getMBBRange(Pred);
@@ -335,16 +344,27 @@
          LiveOutPair &LOP = LOIP.first->second;
          LOP.first = VNI;
          LOP.second = MDT[DefMBB];
+         if (IdxVNI && IdxVNI != VNI)
+           UniqueVNI = false;
+         IdxVNI = VNI;
          continue;
        }
        // No, we need a live-in value for Pred as well
        if (Pred != IdxMBB)
          LiveIn.push_back(MDT[Pred]);
+       else
+         UniqueVNI = false; // Loopback to IdxMBB, ask updateSSA() for help.
     }
   }
 
   // We may need to add phi-def values to preserve the SSA form.
-  VNInfo *IdxVNI = updateSSA(RegIdx, LiveIn, Idx, IdxMBB);
+  if (UniqueVNI) {
+    LiveOutPair LOP(IdxVNI, MDT[LIS.getMBBFromIndex(IdxVNI->def)]);
+    // Update LiveOutCache, but skip IdxMBB at LiveIn[0].
+    for (unsigned i = 1, e = LiveIn.size(); i != e; ++i)
+      LiveOutCache[LiveIn[i]->getBlock()] = LOP;
+  } else
+    IdxVNI = updateSSA(RegIdx, LiveIn, Idx, IdxMBB);
 
 #ifndef NDEBUG
   // Check the LiveOutCache invariants.





More information about the llvm-commits mailing list