On 13/11/18 23:19 +0000, Jonathan Wakely wrote:
On 13/11/18 22:59 +0000, Jonathan Wakely wrote:
        * src/c++17/memory_resource.cc (bitset::find_first_unset()): Remove
        unused function.
        (bitset::get_first_unset()): Remove loop, if there's are unset bits
        then _M_next_word refers to the first one and there's no need to loop.
        (_Pool::_Pool(size_t, size_t), _Pool::block_size()): Remove dead code.


   size_type get_first_unset() noexcept
   {
-      for (size_type i = _M_next_word; i < nwords(); ++i)
+      if (_M_next_word < nwords())
        {
-         const size_type n = std::__countr_one(_M_words[i]);
+         const size_type n = std::__countr_one(_M_words[_M_next_word]);
          if (n < bits_per_word)
            {
              const word bit = word(1) << n;
-             _M_words[i] |= bit;
-             if (i == _M_next_word)
+             _M_words[_M_next_word] |= bit;
+             const size_t res = (_M_next_word * bits_per_word) + n;
+             if (n == (bits_per_word - 1))
                update_next_word();
-             return (i * bits_per_word) + n;
+             return res;
            }
        }
     return size_type(-1);

I'm not sure why, but this version seems to perform measurably worse.
I'll investigate, and maybe revert the change.

The attached patch restores the previous performance. I'll finish
testing it tomorrow.

diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc
index 605bdd53950..79c1665146d 100644
--- a/libstdc++-v3/src/c++17/memory_resource.cc
+++ b/libstdc++-v3/src/c++17/memory_resource.cc
@@ -335,17 +335,16 @@ namespace pmr
 
     size_type get_first_unset() noexcept
     {
-      if (_M_next_word < nwords())
+      const size_type wd = _M_next_word;
+      if (wd < nwords())
 	{
-	  const size_type n = std::__countr_one(_M_words[_M_next_word]);
+	  const size_type n = std::__countr_one(_M_words[wd]);
 	  if (n < bits_per_word)
 	    {
 	      const word bit = word(1) << n;
-	      _M_words[_M_next_word] |= bit;
-	      const size_t res = (_M_next_word * bits_per_word) + n;
-	      if (n == (bits_per_word - 1))
-		update_next_word();
-	      return res;
+	      _M_words[wd] |= bit;
+	      update_next_word();
+	      return (wd * bits_per_word) + n;
 	    }
 	}
       return size_type(-1);

Reply via email to