http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53366
Uros Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 --- Comment #3 from Uros Bizjak <ubizjak at gmail dot com> 2012-05-16 16:48:39 UTC --- Even more reduced testcase, fails with -O3 -mavx, works with -O3 -msse4: --cut here-- struct S { double v[3]; }; struct T { struct S r, i; }; struct U { struct T j[2]; }; void __attribute__((noinline)) foo (struct U *__restrict p1, const double _Complex * __restrict x) { int i, j; for (j = 0; j < 2; ++j) { double a = __builtin_creal (x[j]); double b = __builtin_cimag (x[j]); double c = __builtin_creal (x[j+2]); double d = __builtin_cimag (x[j+2]); for (i = 0; i < 3; ++i) { p1->j[j].r.v[i] += a; p1->j[j].r.v[i] += c; p1->j[j].i.v[i] += b; p1->j[j].i.v[i] += d; } } } _Complex double x[4]; struct U p1; int main () { int i, j; for (i = 0; i < 4; ++i) x[i] = i + 1.0iF * (2 * i); foo (&p1, x); for (j = 0; j < 2; ++j) for (i = 0; i < 3; ++i) if (p1.j[j].r.v[i] != __builtin_creal (x[j] + x[j+2]) || p1.j[j].i.v[i] != __builtin_cimag (x[j] + x[j+2])) __builtin_abort (); return 0; } --cut here--