compute dominator tree children in a deterministic order that does not depend
authorChris Lattner <sabre@nondot.org>
Sat, 19 Jun 2004 20:13:48 +0000 (20:13 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 19 Jun 2004 20:13:48 +0000 (20:13 +0000)
on the address of BasicBlock objects in memory.  This eliminates stuff like this:

 Inorder Dominator Tree:
   [1]  %entry
     [2]  %loopentry
-      [3]  %loopexit
       [3]  %no_exit
-        [4]  %endif
         [4]  %then
+        [4]  %endif
+      [3]  %loopexit
       [3]  %return

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

lib/VMCore/Dominators.cpp

index 76ad59b354460eb9eaf0f24f7c35ba8db4bd0e98..b9eee7f4598cafaeb03eb25f36114a756cd14c3f 100644 (file)
@@ -373,19 +373,20 @@ void DominatorTree::calculate(const ImmediateDominators &ID) {
   BasicBlock *Root = Roots[0];
   Nodes[Root] = RootNode = new Node(Root, 0); // Add a node for the root...
 
+  Function *F = Root->getParent();
   // Loop over all of the reachable blocks in the function...
-  for (ImmediateDominators::const_iterator I = ID.begin(), E = ID.end();
-       I != E; ++I) {
-    Node *&BBNode = Nodes[I->first];
-    if (!BBNode) {  // Haven't calculated this node yet?
-      // Get or calculate the node for the immediate dominator
-      Node *IDomNode = getNodeForBlock(I->second);
-
-      // Add a new tree node for this BasicBlock, and link it as a child of
-      // IDomNode
-      BBNode = IDomNode->addChild(new Node(I->first, IDomNode));
+  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
+    if (BasicBlock *ImmDom = ID.get(I)) {  // Reachable block.
+      Node *&BBNode = Nodes[I];
+      if (!BBNode) {  // Haven't calculated this node yet?
+        // Get or calculate the node for the immediate dominator
+        Node *IDomNode = getNodeForBlock(ImmDom);
+
+        // Add a new tree node for this BasicBlock, and link it as a child of
+        // IDomNode
+        BBNode = IDomNode->addChild(new Node(I, IDomNode));
+      }
     }
-  }
 }
 
 static std::ostream &operator<<(std::ostream &o,