[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