https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117043
--- Comment #2 from Yi <652023330028 at smail dot nju.edu.cn> --- When the size of the array is 20: https://godbolt.org/z/EKfrWYTGb int data[20]; void f() { int a[20]; for(int i = 0; i < 20; i++){ a[i] = 0; } for(int i = 0; i < 20; i++){ data[i] = data[i - a[i]] + 1; } } clang works as expected: f(): movdqa xmm0, xmmword ptr [rip + data] pcmpeqd xmm1, xmm1 psubd xmm0, xmm1 movdqa xmmword ptr [rip + data], xmm0 movdqa xmm0, xmmword ptr [rip + data+16] psubd xmm0, xmm1 movdqa xmmword ptr [rip + data+16], xmm0 movdqa xmm0, xmmword ptr [rip + data+32] psubd xmm0, xmm1 movdqa xmmword ptr [rip + data+32], xmm0 movdqa xmm0, xmmword ptr [rip + data+48] psubd xmm0, xmm1 movdqa xmmword ptr [rip + data+48], xmm0 movdqa xmm0, xmmword ptr [rip + data+64] psubd xmm0, xmm1 movdqa xmmword ptr [rip + data+64], xmm0 ret but gcc: f(): xor eax, eax .L2: movsx rdx, eax mov edx, DWORD PTR data[0+rdx*4] add edx, 1 mov DWORD PTR data[0+rax*4], edx add rax, 1 cmp rax, 20 jne .L2 ret <source>:8:22: missed: couldn't vectorize loop <source>:9:32: missed: possible alias involving gather/scatter between data[_2] and data[i_20] <source>:6:14: missed: statement clobbers memory: __builtin_memset (&a, 0, 80); ASM generation compiler returned: 0 <source>:8:22: missed: couldn't vectorize loop <source>:9:32: missed: possible alias involving gather/scatter between data[_2] and data[i_20] <source>:6:14: missed: statement clobbers memory: __builtin_memset (&a, 0, 80);