[Bug middle-end/88487] New: union prevents autovectorization

bugzilla@poradnik-webmastera.com gcc-bugzilla@gcc.gnu.org
Thu Dec 13 17:04:00 GMT 2018


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

            Bug ID: 88487
           Summary: union prevents autovectorization
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bugzilla@poradnik-webmastera.com
  Target Milestone: ---

When pointer to data is inside union, loops are not autovectorized. This also
happen when I removed "i" field from union, so it had only one field. Code
compiled with -O3 -mavx

[code]
struct S1
{
    union
    {
        double* __restrict__ * __restrict__ d;
        int* __restrict__ * __restrict__ i;
    } u;
};

struct S2
{
    double* __restrict__ * __restrict__ d;
};

void test1(S1* __restrict__ s1, S1* __restrict__ s2)
{
    for (int n = 0; n < 2; ++n)
    {
        s1->u.d[n][0] = s2->u.d[n][0];
        s1->u.d[n][1] = s2->u.d[n][1];
    }
}

void test2(S2* __restrict__ s1, S2* __restrict__ s2)
{
    for (int n = 0; n < 2; ++n)
    {
        s1->d[n][0] = s2->d[n][0];
        s1->d[n][1] = s2->d[n][1];
    }
}
[/code]

[asm]
test1(S1*, S1*):
        mov     rdx, QWORD PTR [rsi]
        mov     rax, QWORD PTR [rdi]
        mov     rsi, QWORD PTR [rdx]
        mov     rcx, QWORD PTR [rax]
        mov     rdx, QWORD PTR [rdx+8]
        mov     rax, QWORD PTR [rax+8]
        vmovsd  xmm0, QWORD PTR [rsi]
        vmovsd  QWORD PTR [rcx], xmm0
        vmovsd  xmm0, QWORD PTR [rsi+8]
        vmovsd  QWORD PTR [rcx+8], xmm0
        vmovsd  xmm0, QWORD PTR [rdx]
        vmovsd  QWORD PTR [rax], xmm0
        vmovsd  xmm0, QWORD PTR [rdx+8]
        vmovsd  QWORD PTR [rax+8], xmm0
        ret
test2(S2*, S2*):
        mov     rdx, QWORD PTR [rsi]
        mov     rax, QWORD PTR [rdi]
        mov     rcx, QWORD PTR [rdx]
        mov     rdx, QWORD PTR [rdx+8]
        vmovupd xmm0, XMMWORD PTR [rcx]
        mov     rcx, QWORD PTR [rax]
        mov     rax, QWORD PTR [rax+8]
        vmovups XMMWORD PTR [rcx], xmm0
        vmovupd xmm0, XMMWORD PTR [rdx]
        vmovups XMMWORD PTR [rax], xmm0
        ret
[/asm]


More information about the Gcc-bugs mailing list