[llvm] [ADT] Add computeNumBuckets to DenseMap (NFC) (PR #168301)
Kazu Hirata via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 16 17:39:18 PST 2025
https://github.com/kazutakahirata updated https://github.com/llvm/llvm-project/pull/168301
>From 7b686ec7d9e78aa4e42ad2397bcab1a9498faae6 Mon Sep 17 00:00:00 2001
From: Kazu Hirata <kazu at google.com>
Date: Sun, 16 Nov 2025 10:05:10 -0800
Subject: [PATCH 1/2] [ADT] Add computeNumBuckets to DenseMap (NFC)
This patch adds computeNumBuckets, a helper function to compute the
number of buckets.
This is part of the effort outlined in #168255. This makes it easier
to move the core logic of grow() to DenseMapBase::grow().
---
llvm/include/llvm/ADT/DenseMap.h | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h
index 86592f12ce62c..152b6a237357d 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -556,7 +556,10 @@ class DenseMapBase : public DebugEpochBase {
return llvm::make_range(getBuckets(), getBucketsEnd());
}
- void grow(unsigned AtLeast) { derived().grow(AtLeast); }
+ void grow(unsigned AtLeast) {
+ AtLeast = derived().computeNumBuckets(AtLeast);
+ derived().grow(AtLeast);
+ }
template <typename LookupKeyT>
BucketT *findBucketForInsertion(const LookupKeyT &Lookup,
@@ -840,8 +843,11 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
NumBuckets = 0;
}
+ static unsigned computeNumBuckets(unsigned NumBuckets) {
+ return std::max(64u, static_cast<unsigned>(NextPowerOf2(NumBuckets - 1)));
+ }
+
void grow(unsigned AtLeast) {
- AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast - 1));
DenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{});
Tmp.moveFrom(*this);
swapImpl(Tmp);
@@ -1106,10 +1112,14 @@ class SmallDenseMap
new (getLargeRep()) LargeRep{nullptr, 0};
}
- void grow(unsigned AtLeast) {
- if (AtLeast > InlineBuckets)
- AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast - 1));
+ static unsigned computeNumBuckets(unsigned NumBuckets) {
+ if (NumBuckets > InlineBuckets)
+ NumBuckets =
+ std::max(64u, static_cast<unsigned>(NextPowerOf2(NumBuckets - 1)));
+ return NumBuckets;
+ }
+ void grow(unsigned AtLeast) {
SmallDenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{});
Tmp.moveFrom(*this);
>From 92af7cb6f5e4a0407f367ae044edfada7f979b32 Mon Sep 17 00:00:00 2001
From: Kazu Hirata <kazu at google.com>
Date: Sun, 16 Nov 2025 17:32:34 -0800
Subject: [PATCH 2/2] Address comments.
---
llvm/include/llvm/ADT/DenseMap.h | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h
index 152b6a237357d..e496801b4c582 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -556,9 +556,9 @@ class DenseMapBase : public DebugEpochBase {
return llvm::make_range(getBuckets(), getBucketsEnd());
}
- void grow(unsigned AtLeast) {
- AtLeast = derived().computeNumBuckets(AtLeast);
- derived().grow(AtLeast);
+ void grow(unsigned NumBuckets) {
+ NumBuckets = DerivedT::roundUpNumBuckets(NumBuckets);
+ derived().grow(NumBuckets);
}
template <typename LookupKeyT>
@@ -843,8 +843,9 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
NumBuckets = 0;
}
- static unsigned computeNumBuckets(unsigned NumBuckets) {
- return std::max(64u, static_cast<unsigned>(NextPowerOf2(NumBuckets - 1)));
+ static unsigned roundUpNumBuckets(unsigned MinNumBuckets) {
+ return std::max(64u,
+ static_cast<unsigned>(NextPowerOf2(MinNumBuckets - 1)));
}
void grow(unsigned AtLeast) {
@@ -1112,15 +1113,15 @@ class SmallDenseMap
new (getLargeRep()) LargeRep{nullptr, 0};
}
- static unsigned computeNumBuckets(unsigned NumBuckets) {
- if (NumBuckets > InlineBuckets)
- NumBuckets =
- std::max(64u, static_cast<unsigned>(NextPowerOf2(NumBuckets - 1)));
- return NumBuckets;
+ static unsigned roundUpNumBuckets(unsigned MinNumBuckets) {
+ if (MinNumBuckets <= InlineBuckets)
+ return MinNumBuckets;
+ return std::max(64u,
+ static_cast<unsigned>(NextPowerOf2(MinNumBuckets - 1)));
}
- void grow(unsigned AtLeast) {
- SmallDenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{});
+ void grow(unsigned NumBuckets) {
+ SmallDenseMap Tmp(NumBuckets, typename BaseT::ExactBucketCount{});
Tmp.moveFrom(*this);
if (Tmp.Small) {
More information about the llvm-commits
mailing list