http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57521
Bug ID: 57521 Summary: wrong code for expressions in loop at -O3 Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: dhazeghi at yahoo dot com The following code is miscompiled with current gcc trunk at -O3 optimization on x86_64-linux. I've tried to reduce it somewhat from the original form. Note that 'e' is only touched in one place. This also fails on 4.7 and 4.8 and is a regression from gcc 4.6. $ gcc-trunk -v gcc version 4.9.0 20130603 (experimental) [trunk revision 199601] (GCC) $ gcc-trunk -O2 wrong.c $ ./a.out 1 $ gcc-4.6 -O3 wrong.c $ ./a.out 1 $ gcc-trunk -O3 wrong.c $ ./a.out 0 $ -------------------------------------- int printf (const char *, ...); int a, b, c, d, o = 1, p; short e; int fn1 (int * p1) { int f, g, h, j = 0, k = 0, l = 0; unsigned int i; int *m[1] = { &l }; for (; b >= 0; b--) { if (*p1) if (j >= 0) { int n = 1; e = 1; h = a ? a : 1 % n; g = h > 0 ? 0 : h + 1; k = c + g; } else continue; else { f = d > 0 ? 0 : d + 1; i = f; j = 1 + i; } l++; } return k; } int main () { for (;; p++) { fn1 (&o); break; } printf ("%d\n", e); return 0; }