Index: include/llvm/ADT/DenseSet.h =================================================================== --- include/llvm/ADT/DenseSet.h +++ include/llvm/ADT/DenseSet.h @@ -16,6 +16,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMapInfo.h" +#include "llvm/Support/MathExtras.h" #include "llvm/Support/type_traits.h" #include #include @@ -67,7 +68,7 @@ explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {} DenseSetImpl(std::initializer_list Elems) - : DenseSetImpl(Elems.size()) { + : DenseSetImpl(PowerOf2Ceil(Elems.size())) { insert(Elems.begin(), Elems.end()); } Index: unittests/ADT/DenseSetTest.cpp =================================================================== --- unittests/ADT/DenseSetTest.cpp +++ unittests/ADT/DenseSetTest.cpp @@ -80,6 +80,14 @@ EXPECT_EQ(0u, set.count(3)); } +TYPED_TEST(DenseSetTest, InitializerListWithNonPowerOfTwoLength) { + TypeParam set({1, 2, 3}); + EXPECT_EQ(3u, set.size()); + EXPECT_EQ(1u, set.count(1)); + EXPECT_EQ(1u, set.count(2)); + EXPECT_EQ(1u, set.count(3)); +} + TYPED_TEST(DenseSetTest, ConstIteratorComparison) { TypeParam set({1}); const TypeParam &cset = set;