[llvm] [DomTree] Store ReverseChildren as indices (NFC) (PR #73505)

via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 27 03:39:12 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-support

Author: Nikita Popov (nikic)

<details>
<summary>Changes</summary>

Store the ReverseChildren using node indices instead of node pointers. This avoids some more hash table lookups.

I've also increased the size of the SmallVector from 2 to 4. As the indices are half as large as the pointers (on 64bit) this keeps memory usage the same as before. I've found the larger SmallVector to perform a bit better.

Compile-time results: http://llvm-compile-time-tracker.com/compare.php?from=272085f10bfaa33349682a9e4d08c990c159355d&to=3df05125000536a0c954dacac2d5a1b232be3efe&stat=instructions%3Au

---
Full diff: https://github.com/llvm/llvm-project/pull/73505.diff


1 Files Affected:

- (modified) llvm/include/llvm/Support/GenericDomTreeConstruction.h (+6-9) 


``````````diff
diff --git a/llvm/include/llvm/Support/GenericDomTreeConstruction.h b/llvm/include/llvm/Support/GenericDomTreeConstruction.h
index 97529cd3277f30b..4ecf492b2847489 100644
--- a/llvm/include/llvm/Support/GenericDomTreeConstruction.h
+++ b/llvm/include/llvm/Support/GenericDomTreeConstruction.h
@@ -67,7 +67,7 @@ struct SemiNCAInfo {
     unsigned Semi = 0;
     unsigned Label = 0;
     NodePtr IDom = nullptr;
-    SmallVector<NodePtr, 2> ReverseChildren;
+    SmallVector<unsigned, 4> ReverseChildren;
   };
 
   // Number to node mapping is 1-based. Initialize the mapping to start with
@@ -205,7 +205,7 @@ struct SemiNCAInfo {
         // Don't visit nodes more than once but remember to collect
         // ReverseChildren.
         if (SIT != NodeToInfo.end() && SIT->second.DFSNum != 0) {
-          if (Succ != BB) SIT->second.ReverseChildren.push_back(BB);
+          if (Succ != BB) SIT->second.ReverseChildren.push_back(LastNum);
           continue;
         }
 
@@ -216,7 +216,7 @@ struct SemiNCAInfo {
         auto &SuccInfo = NodeToInfo[Succ];
         WorkList.push_back(Succ);
         SuccInfo.Parent = LastNum;
-        SuccInfo.ReverseChildren.push_back(BB);
+        SuccInfo.ReverseChildren.push_back(LastNum);
       }
     }
 
@@ -236,10 +236,10 @@ struct SemiNCAInfo {
   //
   // For each vertex V, its Label points to the vertex with the minimal sdom(U)
   // (Semi) in its path from V (included) to NodeToInfo[V].Parent (excluded).
-  unsigned eval(NodePtr V, unsigned LastLinked,
+  unsigned eval(unsigned V, unsigned LastLinked,
                 SmallVectorImpl<InfoRec *> &Stack,
                 ArrayRef<InfoRec *> NumToInfo) {
-    InfoRec *VInfo = &NodeToInfo[V];
+    InfoRec *VInfo = NumToInfo[V];
     if (VInfo->Parent < LastLinked)
       return VInfo->Label;
 
@@ -287,10 +287,7 @@ struct SemiNCAInfo {
 
       // Initialize the semi dominator to point to the parent node.
       WInfo.Semi = WInfo.Parent;
-      for (const auto &N : WInfo.ReverseChildren) {
-        assert(NodeToInfo.contains(N) &&
-               "ReverseChildren should not contain unreachable predecessors");
-
+      for (unsigned N : WInfo.ReverseChildren) {
         unsigned SemiU = NumToInfo[eval(N, i + 1, EvalStack, NumToInfo)]->Semi;
         if (SemiU < WInfo.Semi) WInfo.Semi = SemiU;
       }

``````````

</details>


https://github.com/llvm/llvm-project/pull/73505


More information about the llvm-commits mailing list