[llvm] [ADT] Move initWithExactBucketCount to DenseMapBase (NFC) (PR #168283)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 16 11:13:54 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-adt
Author: Kazu Hirata (kazutakahirata)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/168283.diff
1 Files Affected:
- (modified) llvm/include/llvm/ADT/DenseMap.h (+19-21)
``````````diff
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) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/168283
More information about the llvm-commits
mailing list