From 7b686ec7d9e78aa4e42ad2397bcab1a9498faae6 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Sun, 16 Nov 2025 10:05:10 -0800 Subject: [PATCH 1/3] [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 BucketT *findBucketForInsertion(const LookupKeyT &Lookup, @@ -840,8 +843,11 @@ class DenseMap : public DenseMapBase, NumBuckets = 0; } + static unsigned computeNumBuckets(unsigned NumBuckets) { + return std::max(64u, static_cast(NextPowerOf2(NumBuckets - 1))); + } + void grow(unsigned AtLeast) { - AtLeast = std::max(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(64, NextPowerOf2(AtLeast - 1)); + static unsigned computeNumBuckets(unsigned NumBuckets) { + if (NumBuckets > InlineBuckets) + NumBuckets = + std::max(64u, static_cast(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 Date: Sun, 16 Nov 2025 17:32:34 -0800 Subject: [PATCH 2/3] 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 @@ -843,8 +843,9 @@ class DenseMap : public DenseMapBase, NumBuckets = 0; } - static unsigned computeNumBuckets(unsigned NumBuckets) { - return std::max(64u, static_cast(NextPowerOf2(NumBuckets - 1))); + static unsigned roundUpNumBuckets(unsigned MinNumBuckets) { + return std::max(64u, + static_cast(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(NextPowerOf2(NumBuckets - 1))); - return NumBuckets; + static unsigned roundUpNumBuckets(unsigned MinNumBuckets) { + if (MinNumBuckets <= InlineBuckets) + return MinNumBuckets; + return std::max(64u, + static_cast(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) { From 8812bf7f1a2b655af60b1c67e48b79691c5b8b7b Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Sun, 16 Nov 2025 18:38:13 -0800 Subject: [PATCH 3/3] Address a comment. --- llvm/include/llvm/ADT/DenseMap.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index e496801b4c582..60448927248d7 100644 --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -556,8 +556,8 @@ class DenseMapBase : public DebugEpochBase { return llvm::make_range(getBuckets(), getBucketsEnd()); } - void grow(unsigned NumBuckets) { - NumBuckets = DerivedT::roundUpNumBuckets(NumBuckets); + void grow(unsigned MinNumBuckets) { + unsigned NumBuckets = DerivedT::roundUpNumBuckets(MinNumBuckets); derived().grow(NumBuckets); }