[llvm] 688b190 - [ADT] Simplify DenseMap::grow (NFC) (#168238)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 16 08:08:55 PST 2025
Author: Kazu Hirata
Date: 2025-11-16T08:08:52-08:00
New Revision: 688b190745655c30a39a25f2e274fd62f0e9cce4
URL: https://github.com/llvm/llvm-project/commit/688b190745655c30a39a25f2e274fd62f0e9cce4
DIFF: https://github.com/llvm/llvm-project/commit/688b190745655c30a39a25f2e274fd62f0e9cce4.diff
LOG: [ADT] Simplify DenseMap::grow (NFC) (#168238)
This patch simplifies DenseMap::grow by reimplementing it in terms of
DenseMapBase::moveFrom.
Since moveFrom iterates over the bucket range, we don't need:
if (!OldBuckets)
The old bucket array is released by the destructor on Tmp.
This patch removes moveFromOldBuckets as it's no longer used with this
patch. moveFromImpl is "inlined" into moveFrom.
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 094dc5730a8d9..7926159c4c09c 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -413,11 +413,13 @@ class DenseMapBase : public DebugEpochBase {
return NextPowerOf2(NumEntries * 4 / 3 + 1);
}
- void moveFromImpl(iterator_range<BucketT *> OldBuckets) {
+ // Move key/value from Other to *this.
+ // Other is left in a valid but empty state.
+ void moveFrom(DerivedT &Other) {
// Insert all the old elements.
const KeyT EmptyKey = KeyInfoT::getEmptyKey();
const KeyT TombstoneKey = KeyInfoT::getTombstoneKey();
- for (BucketT &B : OldBuckets) {
+ for (BucketT &B : Other.buckets()) {
if (!KeyInfoT::isEqual(B.getFirst(), EmptyKey) &&
!KeyInfoT::isEqual(B.getFirst(), TombstoneKey)) {
// Insert the key/value into the new table.
@@ -434,17 +436,6 @@ class DenseMapBase : public DebugEpochBase {
}
B.getFirst().~KeyT();
}
- }
-
- void moveFromOldBuckets(iterator_range<BucketT *> OldBuckets) {
- initEmpty();
- moveFromImpl(OldBuckets);
- }
-
- // Move key/value from Other to *this.
- // Other is left in a valid but empty state.
- void moveFrom(DerivedT &Other) {
- moveFromImpl(Other.buckets());
Other.derived().kill();
}
@@ -738,6 +729,11 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
unsigned NumTombstones;
unsigned NumBuckets;
+ struct ExactBucketCount {};
+ explicit DenseMap(unsigned NumBuckets, ExactBucketCount) {
+ initWithExactBucketCount(NumBuckets);
+ }
+
public:
/// Create a DenseMap with an optional \p NumElementsToReserve to guarantee
/// that this number of elements can be inserted in the map without grow().
@@ -822,9 +818,8 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
return true;
}
- void init(unsigned InitNumEntries) {
- auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
- if (allocateBuckets(InitBuckets)) {
+ void initWithExactBucketCount(unsigned NewNumBuckets) {
+ if (allocateBuckets(NewNumBuckets)) {
this->BaseT::initEmpty();
} else {
NumEntries = 0;
@@ -832,6 +827,11 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
}
}
+ void init(unsigned InitNumEntries) {
+ auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
+ initWithExactBucketCount(InitBuckets);
+ }
+
// Put the zombie instance in a known good state after a move.
void kill() {
deallocateBuckets();
@@ -840,23 +840,10 @@ class DenseMap : public DenseMapBase<DenseMap<KeyT, ValueT, KeyInfoT, BucketT>,
}
void grow(unsigned AtLeast) {
- unsigned OldNumBuckets = NumBuckets;
- BucketT *OldBuckets = Buckets;
-
- allocateBuckets(std::max<unsigned>(
- 64, static_cast<unsigned>(NextPowerOf2(AtLeast - 1))));
- assert(Buckets);
- if (!OldBuckets) {
- this->BaseT::initEmpty();
- return;
- }
-
- this->moveFromOldBuckets(
- llvm::make_range(OldBuckets, OldBuckets + OldNumBuckets));
-
- // Free the old table.
- deallocate_buffer(OldBuckets, sizeof(BucketT) * OldNumBuckets,
- alignof(BucketT));
+ AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast - 1));
+ DenseMap Tmp(AtLeast, ExactBucketCount{});
+ Tmp.moveFrom(*this);
+ swapImpl(Tmp);
}
// Plan how to shrink the bucket table. Return:
More information about the llvm-commits
mailing list