https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94823

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
>In particular when __k is zero we're taking '(2^64 - 1) mod __n', which is not 
>necessarily __n - 1, the last position in the buffer, right?

Yes that is correct except when __k is 0, then __begin will the same values so
it does not matter in the end ...
      std::fill(__begin, __end, _Type(0x8b8b8b8bu));

.....
      for (size_t __k = 0; __k < __m; ++__k)
        {
          _Type __arg = (__begin[__k % __n]
                         ^ __begin[(__k + __p) % __n]
                         ^ __begin[(__k - 1) % __n]);

So when __k == 0, then all three of those loads will be _Type(0x8b8b8b8bu)
really; no matter what the values of __n, __p will be.

So it does not matter in the end.

The rest will be similar.

__n can never be 0 because of:
      if (__begin == __end)
        return;

If __n is a value which is greater than SSIZE_MAX, that would be an undefined
case (__begin  > __end).

Reply via email to