Optimize a common case in the Lengauer-Tarjan dominators algorithm. This gives a
authorCameron Zwarich <zwarich@apple.com>
Tue, 23 Nov 2010 06:32:37 +0000 (06:32 +0000)
committerCameron Zwarich <zwarich@apple.com>
Tue, 23 Nov 2010 06:32:37 +0000 (06:32 +0000)
9.7% speedup running domtree on test-suite.

Reviewed by Chris Lattner.

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

include/llvm/Analysis/DominatorInternals.h

index 654289e6305c1b44d219cb1ecad7822138d46f3c..54993e29cd314aa0564cc7573f5dfa0cd6658328 100644 (file)
@@ -278,9 +278,16 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT,
       }
     }
 
-    DT.Info[DT.Vertex[WInfo.Semi]].Bucket.push_back(W);
-
     typename GraphT::NodeType* WParent = DT.Vertex[WInfo.Parent];
+
+    // If V is a non-root vertex and sdom(V) = parent(V), then idom(V) is
+    // necessarily parent(V). In this case, set idom(V) here and avoid placing
+    // V into a bucket.
+    if (WInfo.Semi == WInfo.Parent)
+      DT.IDoms[W] = WParent;
+    else
+      DT.Info[DT.Vertex[WInfo.Semi]].Bucket.push_back(W);
+
     Link<GraphT>(DT, WInfo.Parent, W, WInfo);
 
     // Step #3: Implicitly define the immediate dominator of vertices