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: bugzi...@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]