<div dir="ltr">Could you include a test that demonstrates non-growth (I think someone contributed a similar patch for DenseMap's growth recently - could check how that was tested (I think it could be tested better with a move-counting object, for example, but not a strict requirement))?</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 21, 2016 at 11:15 PM, Mehdi AMINI via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">joker.eph created this revision.<br>
joker.eph added a reviewer: dblaikie.<br>
joker.eph added a subscriber: llvm-commits.<br>
<br>
StringMap ctor accepts an initialize size, but expect it to be<br>
rounded to the next power of 2. The ctor can handle that directly<br>
instead of expecting clients to round it. Also, since the map will<br>
resize itself when 75% full, take this into account an initialize<br>
a larger initial size to avoid any growth.<br>
<br>
<a href="http://reviews.llvm.org/D18344" rel="noreferrer" target="_blank">http://reviews.llvm.org/D18344</a><br>
<br>
Files:<br>
  lib/Support/StringMap.cpp<br>
  unittests/ADT/StringMapTest.cpp<br>
<br>
Index: unittests/ADT/StringMapTest.cpp<br>
===================================================================<br>
--- unittests/ADT/StringMapTest.cpp<br>
+++ unittests/ADT/StringMapTest.cpp<br>
@@ -231,12 +231,12 @@<br>
   // moved to a different bucket during internal rehashing. This depends on<br>
   // the particular key, and the implementation of StringMap and HashString.<br>
   // Changes to those might result in this test not actually checking that.<br>
-  StringMap<uint32_t> t(1);<br>
-  EXPECT_EQ(1u, t.getNumBuckets());<br>
+  StringMap<uint32_t> t(0);<br>
+  EXPECT_EQ(0u, t.getNumBuckets());<br>
<br>
   StringMap<uint32_t>::iterator It =<br>
     t.insert(std::make_pair("abcdef", 42)).first;<br>
-  EXPECT_EQ(2u, t.getNumBuckets());<br>
+  EXPECT_EQ(16u, t.getNumBuckets());<br>
   EXPECT_EQ("abcdef", It->first());<br>
   EXPECT_EQ(42u, It->second);<br>
 }<br>
Index: lib/Support/StringMap.cpp<br>
===================================================================<br>
--- lib/Support/StringMap.cpp<br>
+++ lib/Support/StringMap.cpp<br>
@@ -22,6 +22,13 @@<br>
<br>
   // If a size is specified, initialize the table with that many buckets.<br>
   if (InitSize) {<br>
+    // The table will grow when the number of entries reach 3/4 of the number of<br>
+    // buckets. To guarantee that "InitSize" number of entries can be inserted<br>
+    // in the table without growing, we allocate just what is needed here.<br>
+    InitSize = (InitSize * 4 + 2) / 3;<br>
+    // Size has to be a power of 2<br>
+    if (!isPowerOf2_32(InitSize))<br>
+      InitSize = NextPowerOf2(InitSize);<br>
     init(InitSize);<br>
     return;<br>
   }<br>
<br>
<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>