[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