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);

Reply via email to