[PATCH] D36442: [DomTree] Use a non-recursive DFS instead of a recursive one; NFC

Sanjoy Das via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 7 21:51:10 PDT 2017


sanjoy created this revision.
Herald added a subscriber: mcrosier.

The recursive DFS can stack overflow in pathological cases.


https://reviews.llvm.org/D36442

Files:
  include/llvm/Support/GenericDomTreeConstruction.h


Index: include/llvm/Support/GenericDomTreeConstruction.h
===================================================================
--- include/llvm/Support/GenericDomTreeConstruction.h
+++ include/llvm/Support/GenericDomTreeConstruction.h
@@ -433,34 +433,43 @@
     const unsigned NCDLevel = NCD->getLevel();
     DEBUG(dbgs() << "Visiting " << BlockNamePrinter(TN) << "\n");
 
-    assert(TN->getBlock());
-    for (const NodePtr Succ :
-        ChildrenGetter<NodePtr, IsPostDom>::Get(TN->getBlock())) {
-      const TreeNodePtr SuccTN = DT.getNode(Succ);
-      assert(SuccTN && "Unreachable successor found at reachable insertion");
-      const unsigned SuccLevel = SuccTN->getLevel();
-
-      DEBUG(dbgs() << "\tSuccessor " << BlockNamePrinter(Succ)
-                   << ", level = " << SuccLevel << "\n");
-
-      // Succ dominated by subtree From -- not affected.
-      // (Based on the lemma 2.5 from the second paper.)
-      if (SuccLevel > RootLevel) {
-        DEBUG(dbgs() << "\t\tDominated by subtree From\n");
-        if (II.Visited.count(SuccTN) != 0) continue;
-
-        DEBUG(dbgs() << "\t\tMarking visited not affected "
-                     << BlockNamePrinter(Succ) << "\n");
-        II.Visited.insert(SuccTN);
-        II.VisitedNotAffectedQueue.push_back(SuccTN);
-        VisitInsertion(DT, SuccTN, RootLevel, NCD, II);
-      } else if ((SuccLevel > NCDLevel + 1) && II.Affected.count(SuccTN) == 0) {
-        DEBUG(dbgs() << "\t\tMarking affected and adding "
-                     << BlockNamePrinter(Succ) << " to a Bucket\n");
-        II.Affected.insert(SuccTN);
-        II.Bucket.push({SuccLevel, SuccTN});
+    SmallVector<TreeNodePtr, 8> Stack;
+    Stack.push_back(TN);
+    assert(TN->getBlock() && II.Visited.count(TN) && "Preconditions!");
+
+    do {
+      TreeNodePtr Next = Stack.pop_back_val();
+
+      for (const NodePtr Succ :
+           ChildrenGetter<NodePtr, IsPostDom>::Get(Next->getBlock())) {
+        const TreeNodePtr SuccTN = DT.getNode(Succ);
+        assert(SuccTN && "Unreachable successor found at reachable insertion");
+        const unsigned SuccLevel = SuccTN->getLevel();
+
+        DEBUG(dbgs() << "\tSuccessor " << BlockNamePrinter(Succ)
+                     << ", level = " << SuccLevel << "\n");
+
+        // Succ dominated by subtree From -- not affected.
+        // (Based on the lemma 2.5 from the second paper.)
+        if (SuccLevel > RootLevel) {
+          DEBUG(dbgs() << "\t\tDominated by subtree From\n");
+          if (II.Visited.count(SuccTN) != 0)
+            continue;
+
+          DEBUG(dbgs() << "\t\tMarking visited not affected "
+                       << BlockNamePrinter(Succ) << "\n");
+          II.Visited.insert(SuccTN);
+          II.VisitedNotAffectedQueue.push_back(SuccTN);
+          Stack.push_back(SuccTN);
+        } else if ((SuccLevel > NCDLevel + 1) &&
+                   II.Affected.count(SuccTN) == 0) {
+          DEBUG(dbgs() << "\t\tMarking affected and adding "
+                       << BlockNamePrinter(Succ) << " to a Bucket\n");
+          II.Affected.insert(SuccTN);
+          II.Bucket.push({SuccLevel, SuccTN});
+        }
       }
-    }
+    } while (!Stack.empty());
   }
 
   // Updates immediate dominators and levels after insertion.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36442.110134.patch
Type: text/x-patch
Size: 3271 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170808/7a5f8359/attachment.bin>


More information about the llvm-commits mailing list