https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85637
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- __restrict should work fine for char pointers. With __attribute__((noinline)) void Update(const void* __restrict b, unsigned int len) { if (len) { ... I get with -O2 _ZN7Adler326UpdateEi: .LFB3: .cfi_startproc movzbl %sil, %esi addl (%rdi), %esi movl $-2146992015, %ecx movl 4(%rdi), %r8d movl %esi, %eax addl %esi, %r8d mull %ecx movl %r8d, %eax shrl $15, %edx imull $65521, %edx, %edx subl %edx, %esi mull %ecx movl %esi, (%rdi) movl %edx, %ecx shrl $15, %ecx imull $65521, %ecx, %ecx subl %ecx, %r8d movl %r8d, 4(%rdi) ret