Reduce the number of non-trivial domtree queries by about 1% when
authorDuncan Sands <baldrick@free.fr>
Sun, 5 Feb 2012 15:50:43 +0000 (15:50 +0000)
committerDuncan Sands <baldrick@free.fr>
Sun, 5 Feb 2012 15:50:43 +0000 (15:50 +0000)
compiling sqlite3, by only doing dom queries after the cheap check
rather than interleaved with it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149836 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVN.cpp

index bdcbfb07d6f8ca433b3750c5340faf8fa23cf219..03ebbb15124528c93092a18d23f4e52b4987edf5 100644 (file)
@@ -1996,28 +1996,30 @@ static bool isOnlyReachableViaThisEdge(BasicBlock *Src, BasicBlock *Dst,
                                        DominatorTree *DT) {
   // First off, there must not be more than one edge from Src to Dst, there
   // should be exactly one.  So keep track of the number of times Src occurs
-  // as a predecessor of Dst and fail if it's more than once.  Secondly, any
-  // other predecessors of Dst should be dominated by Dst (see logic below).
+  // as a predecessor of Dst and fail if it's more than once.
   bool SawEdgeFromSrc = false;
   for (pred_iterator PI = pred_begin(Dst), PE = pred_end(Dst); PI != PE; ++PI) {
-    BasicBlock *Pred = *PI;
-    if (Pred == Src) {
-      // An edge from Src to Dst.
-      if (SawEdgeFromSrc)
-        // There are multiple edges from Src to Dst - fail.
-        return false;
-      SawEdgeFromSrc = true;
+    if (*PI != Src)
       continue;
-    }
-    // If the predecessor is not dominated by Dst, then it must be possible to
-    // reach it either without passing through Src (and thus not via the edge)
-    // or by passing through Src but taking a different edge out of Src.  Either
-    // way it is possible to reach Dst without passing via the edge, so fail.
-    if (!DT->dominates(Dst, *PI))
+    // An edge from Src to Dst.
+    if (SawEdgeFromSrc)
+      // There are multiple edges from Src to Dst - fail.
       return false;
+    SawEdgeFromSrc = true;
   }
   assert(SawEdgeFromSrc && "No edge between these basic blocks!");
 
+  // Secondly, any other predecessors of Dst should be dominated by Dst.  If the
+  // predecessor is not dominated by Dst, then it must be possible to reach it
+  // either without passing through Src (thus not via the edge) or by passing
+  // through Src but taking a different edge out of Src.  Either way Dst can be
+  // reached without passing via the edge, so fail.
+  for (pred_iterator PI = pred_begin(Dst), PE = pred_end(Dst); PI != PE; ++PI) {
+    BasicBlock *Pred = *PI;
+    if (Pred != Src && !DT->dominates(Dst, Pred))
+      return false;
+  }
+
   // Every path from the entry block to Dst must at some point pass to Dst from
   // a predecessor that is not dominated by Dst.  This predecessor can only be
   // Src, since all others are dominated by Dst.  As there is only one edge from