[PATCH] Remove redundant loop in unsynchronized_pool_resource code

Jonathan Wakely jwakely@redhat.com
Tue Nov 13 23:19:00 GMT 2018


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.




More information about the Libstdc++ mailing list