From fdbef6a31bf296aea6dead7742578ba64dedbd3b Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Sun, 16 Nov 2025 21:08:51 -0800 Subject: [PATCH] [ADT] Remove DenseMap::init (NFC) This patch removes DenseMap::init and SmallDenseMap::init by inlining them into their call sites and simplifying them. init() is defined as: void init(unsigned InitNumEntries) { auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries); this->initWithExactBucketCount(InitBuckets); } - Constuctors: Now that we have constructors that allocate the exact number of buckets (as opposed to the number of key/value pairs), init() does too much. Once we convert the number of key/value pairs to the number of buckets, we can call the constructors that take the exact number of buckets. - init(0) in the move assignment operators simplifies down to: initWithExactBucketCount(0) - shrink_and_clear() computes the number of buckets to have after the clear operation. As such, we should call initWithExactBucketCount, not init. Otherwise, we would end up adding "load factor padding" on top of NewNumBuckets: NextPowerOf2(NewNumBuckets * 4 / 3 + 1) All in all, init() doesn't bring any value in the current setup. This patch is part of the effort outlined in #168255. --- llvm/include/llvm/ADT/DenseMap.h | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index aa5d8a8729647..e6f4a4d4e676e 100644 --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -162,7 +162,7 @@ class DenseMapBase : public DebugEpochBase { return; } derived().deallocateBuckets(); - derived().init(NewNumBuckets); + initWithExactBucketCount(NewNumBuckets); } /// Return true if the specified key is in the map, false otherwise. @@ -750,9 +750,9 @@ class DenseMap : public DenseMapBase, public: /// Create a DenseMap with an optional \p NumElementsToReserve to guarantee /// that this number of elements can be inserted in the map without grow(). - explicit DenseMap(unsigned NumElementsToReserve = 0) { - init(NumElementsToReserve); - } + explicit DenseMap(unsigned NumElementsToReserve = 0) + : DenseMap(BaseT::getMinBucketToReserveForEntries(NumElementsToReserve), + typename BaseT::ExactBucketCount{}) {} DenseMap(const DenseMap &other) : DenseMap() { this->copyFrom(other); } @@ -784,7 +784,7 @@ class DenseMap : public DenseMapBase, DenseMap &operator=(DenseMap &&other) { this->destroyAll(); deallocateBuckets(); - init(0); + this->initWithExactBucketCount(0); this->swap(other); return *this; } @@ -825,11 +825,6 @@ class DenseMap : public DenseMapBase, return true; } - void init(unsigned InitNumEntries) { - auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries); - this->initWithExactBucketCount(InitBuckets); - } - // Put the zombie instance in a known good state after a move. void kill() { deallocateBuckets(); @@ -898,9 +893,10 @@ class SmallDenseMap } public: - explicit SmallDenseMap(unsigned NumElementsToReserve = 0) { - init(NumElementsToReserve); - } + explicit SmallDenseMap(unsigned NumElementsToReserve = 0) + : SmallDenseMap( + BaseT::getMinBucketToReserveForEntries(NumElementsToReserve), + typename BaseT::ExactBucketCount{}) {} SmallDenseMap(const SmallDenseMap &other) : SmallDenseMap() { this->copyFrom(other); @@ -935,7 +931,7 @@ class SmallDenseMap SmallDenseMap &operator=(SmallDenseMap &&other) { this->destroyAll(); deallocateBuckets(); - init(0); + this->initWithExactBucketCount(0); this->swap(other); return *this; } @@ -1091,11 +1087,6 @@ class SmallDenseMap return true; } - void init(unsigned InitNumEntries) { - auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries); - this->initWithExactBucketCount(InitBuckets); - } - // Put the zombie instance in a known good state after a move. void kill() { deallocateBuckets();