diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -907,6 +907,8 @@ public: explicit SmallDenseMap(unsigned NumInitBuckets = 0) { + if (NumInitBuckets > InlineBuckets) + NumInitBuckets = NextPowerOf2(NumInitBuckets - 1); init(NumInitBuckets); } diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp --- a/llvm/unittests/ADT/DenseMapTest.cpp +++ b/llvm/unittests/ADT/DenseMapTest.cpp @@ -607,6 +607,15 @@ EXPECT_TRUE(map.find(0) == map.end()); } +TEST(DenseMapCustomTest, SmallDenseMapWithNumBucketsNonPowerOf2) { + // Is not power of 2. + const unsigned NumInitBuckets = 33; + // Power of 2 less then NumInitBuckets. + constexpr unsigned InlineBuckets = 4; + // Constructor should not trigger assert. + SmallDenseMap map(NumInitBuckets); +} + TEST(DenseMapCustomTest, TryEmplaceTest) { DenseMap> Map; std::unique_ptr P(new int(2));