diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index 86592f12ce62c..60448927248d7 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 MinNumBuckets) { + unsigned NumBuckets = DerivedT::roundUpNumBuckets(MinNumBuckets); + derived().grow(NumBuckets); + } template BucketT *findBucketForInsertion(const LookupKeyT &Lookup, @@ -840,8 +843,12 @@ class DenseMap : public DenseMapBase, NumBuckets = 0; } + static unsigned roundUpNumBuckets(unsigned MinNumBuckets) { + return std::max(64u, + static_cast(NextPowerOf2(MinNumBuckets - 1))); + } + void grow(unsigned AtLeast) { - AtLeast = std::max(64, NextPowerOf2(AtLeast - 1)); DenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{}); Tmp.moveFrom(*this); swapImpl(Tmp); @@ -1106,11 +1113,15 @@ class SmallDenseMap new (getLargeRep()) LargeRep{nullptr, 0}; } - void grow(unsigned AtLeast) { - if (AtLeast > InlineBuckets) - AtLeast = std::max(64, NextPowerOf2(AtLeast - 1)); + static unsigned roundUpNumBuckets(unsigned MinNumBuckets) { + if (MinNumBuckets <= InlineBuckets) + return MinNumBuckets; + return std::max(64u, + static_cast(NextPowerOf2(MinNumBuckets - 1))); + } - SmallDenseMap Tmp(AtLeast, typename BaseT::ExactBucketCount{}); + void grow(unsigned NumBuckets) { + SmallDenseMap Tmp(NumBuckets, typename BaseT::ExactBucketCount{}); Tmp.moveFrom(*this); if (Tmp.Small) {