[llvm] 1a7cb1e - [ADT] Move initWithExactBucketCount to DenseMapBase (NFC) (#168283)

via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 16 15:23:07 PST 2025


Author: Kazu Hirata
Date: 2025-11-16T15:23:03-08:00
New Revision: 1a7cb1e0c7d0d1621ed264383f4b5807462971be

URL: https://github.com/llvm/llvm-project/commit/1a7cb1e0c7d0d1621ed264383f4b5807462971be
DIFF: https://github.com/llvm/llvm-project/commit/1a7cb1e0c7d0d1621ed264383f4b5807462971be.diff

LOG: [ADT] Move initWithExactBucketCount to DenseMapBase (NFC) (#168283)

This patch moves initWithExactBucketCount and ExactBucketCount to
DenseMapBase to share more code.

Since SmallDenseMap::allocateBuckets always returns true,
initWithExactBucketCount is equivalent to:

  void initWithExactBucketCount(unsigned NewNumBuckets) {
    allocateBuckets(NewNumBuckets);
    initEmpty();
  }

for SmallDenseMap.

Note that ExactBucketCount is not used within DenseMapBase yet.

This moves us closer to the storage policy idea outlined in #168255.

Added: 
    

Modified: 
    llvm/include/llvm/ADT/DenseMap.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h
index 7926159c4c09c..86592f12ce62c 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -369,6 +369,17 @@ class DenseMapBase : public DebugEpochBase {
 protected:
   DenseMapBase() = default;
 
+  struct ExactBucketCount {};
+
+  void initWithExactBucketCount(unsigned NewNumBuckets) {
+    if (derived().allocateBuckets(NewNumBuckets)) {
+      initEmpty();
+    } else {
+      setNumEntries(0);
+      setNumTombstones(0);
+    }
+  }
+
   void destroyAll() {
     // No need to iterate through the buckets if both KeyT and ValueT are
     // trivially destructible.
@@ -729,9 +740,8 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
   unsigned NumTombstones;
   unsigned NumBuckets;
 
-  struct ExactBucketCount {};
-  explicit DenseMap(unsigned NumBuckets, ExactBucketCount) {
-    initWithExactBucketCount(NumBuckets);
+  explicit DenseMap(unsigned NumBuckets, typename BaseT::ExactBucketCount) {
+    this->initWithExactBucketCount(NumBuckets);
   }
 
 public:
@@ -818,18 +828,9 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
     return true;
   }
 
-  void initWithExactBucketCount(unsigned NewNumBuckets) {
-    if (allocateBuckets(NewNumBuckets)) {
-      this->BaseT::initEmpty();
-    } else {
-      NumEntries = 0;
-      NumTombstones = 0;
-    }
-  }
-
   void init(unsigned InitNumEntries) {
     auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
-    initWithExactBucketCount(InitBuckets);
+    this->initWithExactBucketCount(InitBuckets);
   }
 
   // Put the zombie instance in a known good state after a move.
@@ -841,7 +842,7 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
 
   void grow(unsigned AtLeast) {
     AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast - 1));
-    DenseMap Tmp(AtLeast, ExactBucketCount{});
+    DenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{});
     Tmp.moveFrom(*this);
     swapImpl(Tmp);
   }
@@ -891,10 +892,8 @@ class SmallDenseMap
   /// a large bucket. This union will be discriminated by the 'Small' bit.
   AlignedCharArrayUnion<BucketT[InlineBuckets], LargeRep> storage;
 
-  struct ExactBucketCount {};
-  SmallDenseMap(unsigned NumBuckets, ExactBucketCount) {
-    allocateBuckets(NumBuckets);
-    this->BaseT::initEmpty();
+  SmallDenseMap(unsigned NumBuckets, typename BaseT::ExactBucketCount) {
+    this->initWithExactBucketCount(NumBuckets);
   }
 
 public:
@@ -1097,8 +1096,7 @@ class SmallDenseMap
 
   void init(unsigned InitNumEntries) {
     auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
-    allocateBuckets(InitBuckets);
-    this->BaseT::initEmpty();
+    this->initWithExactBucketCount(InitBuckets);
   }
 
   // Put the zombie instance in a known good state after a move.
@@ -1112,7 +1110,7 @@ class SmallDenseMap
     if (AtLeast > InlineBuckets)
       AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast - 1));
 
-    SmallDenseMap Tmp(AtLeast, ExactBucketCount{});
+    SmallDenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{});
     Tmp.moveFrom(*this);
 
     if (Tmp.Small) {


        


More information about the llvm-commits mailing list