https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97311
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- Or something like: auto __b = [__begin, __n](size_t __i) -> _Type& { return __begin[__i % __n]; }; auto __b32 = [__b](size_t __i) { return (uint32_t)__b(__i); }; for (size_t __k = 0; __k < __m; ++__k) { uint32_t __arg = (__b32(__k) ^ __b32(__k + __p) ^ __b32(__k - 1)); uint32_t __r1 = 1664525u * (__arg ^ (__arg >> 27)); uint32_t __r2 = __r1; if (__k == 0) __r2 += __s; else if (__k <= __s) __r2 += __k % __n + _M_v[__k - 1]; else __r2 += __k % __n; __b(__k + __p) = __b32(__k + __p) + __r1; __b(__k + __q) = __b32(__k + __q) + __r2; __b(__k) = __r2; } for (size_t __k = __m; __k < __m + __n; ++__k) { uint32_t __arg = (__b32(__k) + __b32(__k + __p) + __b32(__k - 1)); uint32_t __r3 = (uint32_t)1566083941u * (__arg ^ (__arg >> 27)); uint32_t __r4 = __r3 - __k % __n; __b(__k + __p) ^= __r3; __b(__k + __q) ^= __r4; __b(__k) = __r4; } The current code will work even if the implementation only provides uint_least32_t and not uint32_t, but I don't think we support any targets without uint32_t. So it could be a lot simpler.