From 5bc1fb1f188d55e9549cf3f52628e11c4faa1d1f Mon Sep 17 00:00:00 2001 From: Nikita Popov 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 97529cd3277f3..4ecf492b28474 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 ReverseChildren; + SmallVector 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 &Stack, ArrayRef 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; }