[llvm] ddc70de - [IDF] Use BitVectors indexed by DFS number for visited sets (NFC). (#227832)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 1 10:48:51 PDT 2026
Author: Florian Hahn
Date: 2026-10-01T17:48:37Z
New Revision: ddc70de6ada5822af0ba330a6507e17a07b6b0e4
URL: https://github.com/llvm/llvm-project/commit/ddc70de6ada5822af0ba330a6507e17a07b6b0e4
DIFF: https://github.com/llvm/llvm-project/commit/ddc70de6ada5822af0ba330a6507e17a07b6b0e4.diff
LOG: [IDF] Use BitVectors indexed by DFS number for visited sets (NFC). (#227832)
IDFCalculatorBase::calculate tracks visited dominator tree nodes in two
SmallPtrSets. The DFS numbers computed at the start of calculate are
unique and dense in [0, number of nodes), with the DFS out-number of the
root being the number of nodes, so use them to index BitVectors instead.
This reduces hashing overhead and improves compile-time, depending on
configuration/workload:
stage1-O3: -0.04%
stage1-ReleaseThinLTO: -0.05%
stage1-ReleaseLTO-g: -0.22%
stage1-aarch64-O3: -0.06%
stage2-O3: -0.04%
stage2-clang: -0.04%
https://llvm-compile-time-tracker.com/compare.php?from=b96b66160ace30c2b5eef1f4afdb14c95ecc26cd&to=5ffb13d6d1f87195bba8af13366a152a7de2bfe0&stat=instructions:u
Aided by Opus 5.5
PR: https://github.com/llvm/llvm-project/pull/227832
Added:
Modified:
llvm/include/llvm/Support/GenericIteratedDominanceFrontier.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/Support/GenericIteratedDominanceFrontier.h b/llvm/include/llvm/Support/GenericIteratedDominanceFrontier.h
index c52b2cab377bf..32baf09b8b19d 100644
--- a/llvm/include/llvm/Support/GenericIteratedDominanceFrontier.h
+++ b/llvm/include/llvm/Support/GenericIteratedDominanceFrontier.h
@@ -144,18 +144,20 @@ void IDFCalculatorBase<NodeTy, IsPostDom>::calculate(
DT.updateDFSNumbers();
+ // The DFS in-numbers are unique and dense in [0, number of nodes), with the
+ // root's DFS out-number being the number of nodes. Use them to index the
+ // visited sets.
+ const DomTreeNodeBase<NodeTy> *RootNode = DT.getRootNode();
+ unsigned NumNodes = RootNode ? RootNode->getDFSNumOut() : 0;
+
SmallVector<DomTreeNodeBase<NodeTy> *, 32> Worklist;
- SmallPtrSet<DomTreeNodeBase<NodeTy> *, 16> VisitedPQ;
- SmallPtrSet<DomTreeNodeBase<NodeTy> *, 16> VisitedWorklist;
- if (useLiveIn) {
- VisitedPQ.reserve(LiveInBlocks->size());
- VisitedWorklist.reserve(LiveInBlocks->size());
- }
+ SmallVector<bool, 32> VisitedPQ(NumNodes, false);
+ SmallVector<bool, 32> VisitedWorklist(NumNodes, false);
for (NodeTy *BB : *DefBlocks)
if (DomTreeNodeBase<NodeTy> *Node = DT.getNode(BB)) {
PQ.push({Node, std::make_pair(Node->getLevel(), Node->getDFSNumIn())});
- VisitedWorklist.insert(Node);
+ VisitedWorklist[Node->getDFSNumIn()] = true;
}
while (!PQ.empty()) {
@@ -184,7 +186,7 @@ void IDFCalculatorBase<NodeTy, IsPostDom>::calculate(
if (SuccLevel > RootLevel)
return;
- if (!VisitedPQ.insert(SuccNode).second)
+ if (std::exchange(VisitedPQ[SuccNode->getDFSNumIn()], true))
return;
NodeTy *SuccBB = SuccNode->getBlock();
@@ -201,7 +203,7 @@ void IDFCalculatorBase<NodeTy, IsPostDom>::calculate(
DoWork(Succ);
for (auto DomChild : *Node) {
- if (VisitedWorklist.insert(DomChild).second)
+ if (!std::exchange(VisitedWorklist[DomChild->getDFSNumIn()], true))
Worklist.push_back(DomChild);
}
}
More information about the llvm-commits
mailing list