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

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 27 03:38:43 PST 2023


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

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

>From 5bc1fb1f188d55e9549cf3f52628e11c4faa1d1f Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Mon, 27 Nov 2023 11:16:08 +0100
Subject: [PATCH] [DomTree] Store ReverseChildren as indices (NFC)

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.
---
 .../llvm/Support/GenericDomTreeConstruction.h     | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

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;
       }



More information about the llvm-commits mailing list