[llvm] [Support][NFC] Use single predecessor array in DomTreeConstr (PR #207535)
Alexis Engelke via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 4 23:52:06 PDT 2026
https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/207535
>From 608981c160d2bf00d1e3dff8743da519cb76bdcb Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Sat, 4 Jul 2026 19:37:11 +0000
Subject: [PATCH 1/2] [spr] initial version
Created using spr 1.3.8-wip
---
.../llvm/Support/GenericDomTreeConstruction.h | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/Support/GenericDomTreeConstruction.h b/llvm/include/llvm/Support/GenericDomTreeConstruction.h
index 869087cda219a..dcfeaae6fab98 100644
--- a/llvm/include/llvm/Support/GenericDomTreeConstruction.h
+++ b/llvm/include/llvm/Support/GenericDomTreeConstruction.h
@@ -66,7 +66,7 @@ template <typename DomTreeT> struct SemiNCAInfo {
unsigned Semi = 0;
unsigned Label = 0;
NodePtr IDom = nullptr;
- SmallVector<unsigned, 4> ReverseChildren;
+ unsigned ReverseChildrenStart = 0; ///< Index in ReverseChildren vector.
};
// Number to node mapping is 1-based. Initialize the mapping to start with
@@ -78,6 +78,10 @@ template <typename DomTreeT> struct SemiNCAInfo {
DenseMap<NodePtr, InfoRec>>
NodeInfos;
+ /// Reverse children of nodes; pairs of (DFSNum (predecessor), next-or-zero);
+ /// forms a linked list in this vector; first entry is sentinel.
+ SmallVector<std::pair<unsigned, unsigned>> ReverseChildren = {{0, 0}};
+
using UpdateT = typename DomTreeT::UpdateType;
using UpdateKind = typename DomTreeT::UpdateKind;
struct BatchUpdateInfo {
@@ -209,7 +213,8 @@ template <typename DomTreeT> struct SemiNCAInfo {
while (!WorkList.empty()) {
const auto [BB, ParentNum] = WorkList.pop_back_val();
auto &BBInfo = getNodeInfo(BB);
- BBInfo.ReverseChildren.push_back(ParentNum);
+ ReverseChildren.emplace_back(ParentNum, BBInfo.ReverseChildrenStart);
+ BBInfo.ReverseChildrenStart = ReverseChildren.size() - 1;
// Visited nodes always have positive DFS numbers.
if (BBInfo.DFSNum != 0)
@@ -314,8 +319,12 @@ template <typename DomTreeT> struct SemiNCAInfo {
// Initialize the semi dominator to point to the parent node.
WInfo.Semi = WInfo.Parent;
- for (unsigned N : WInfo.ReverseChildren) {
- unsigned SemiU = NumToInfo[eval(N, i + 1, EvalStack, NumToInfo)]->Semi;
+ unsigned RCIdx = WInfo.ReverseChildrenStart;
+ while (RCIdx != 0) {
+ const auto &Entry = ReverseChildren[RCIdx];
+ RCIdx = Entry.second;
+ unsigned SemiU =
+ NumToInfo[eval(Entry.first, i + 1, EvalStack, NumToInfo)]->Semi;
if (SemiU < WInfo.Semi)
WInfo.Semi = SemiU;
}
>From b71a471b1dd34ea4ba7185ffcccabec5cec5adc4 Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Sun, 5 Jul 2026 06:51:27 +0000
Subject: [PATCH 2/2] inline capacity 32
Created using spr 1.3.8-wip
---
llvm/include/llvm/Support/GenericDomTreeConstruction.h | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/include/llvm/Support/GenericDomTreeConstruction.h b/llvm/include/llvm/Support/GenericDomTreeConstruction.h
index dcfeaae6fab98..54595cf27e4b2 100644
--- a/llvm/include/llvm/Support/GenericDomTreeConstruction.h
+++ b/llvm/include/llvm/Support/GenericDomTreeConstruction.h
@@ -80,7 +80,7 @@ template <typename DomTreeT> struct SemiNCAInfo {
/// Reverse children of nodes; pairs of (DFSNum (predecessor), next-or-zero);
/// forms a linked list in this vector; first entry is sentinel.
- SmallVector<std::pair<unsigned, unsigned>> ReverseChildren = {{0, 0}};
+ SmallVector<std::pair<unsigned, unsigned>, 32> ReverseChildren = {{0, 0}};
using UpdateT = typename DomTreeT::UpdateType;
using UpdateKind = typename DomTreeT::UpdateKind;
@@ -319,8 +319,7 @@ template <typename DomTreeT> struct SemiNCAInfo {
// Initialize the semi dominator to point to the parent node.
WInfo.Semi = WInfo.Parent;
- unsigned RCIdx = WInfo.ReverseChildrenStart;
- while (RCIdx != 0) {
+ for (unsigned RCIdx = WInfo.ReverseChildrenStart; RCIdx != 0;) {
const auto &Entry = ReverseChildren[RCIdx];
RCIdx = Entry.second;
unsigned SemiU =
More information about the llvm-commits
mailing list