http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57608
Bug ID: 57608 Summary: wrong code for expression at -O3 on x86_64-linux-gnu with -m32 Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: dhazeghi at yahoo dot com Current gcc trunk and 4.8.x produces wrong code for the following testcase on x86_64-linux when compiled at -O3 in 32-bit mode. This is a regression from 4.7.x. $ gcc-trunk -v gcc version 4.9.0 20130613 (experimental) [trunk revision 200065] (GCC) $ gcc-trunk -O2 -m32 wrong.c $ ./a.out 2 $ gcc-4.7 -O3 -m32 wrong.c $ ./a.out 2 $ gcc-trunk -O3 -m32 wrong.c $ ./a.out 3 $ ---------------------------------- int printf(const char *, ...); int a, b, d, e, *f = &b; long long l, *pl = &l; char c, *pc = &c; int bar(int r, long long s) { b++; a = 0; if (b) { b = r + s; b++; return c; } { int arr[] = {}; return 0; } } void foo(int j) { int k; for (; j != 5; ++j) { *pc = *f; for (; e != 1; e++) { *pl = 0; { int i = 0; for (; i < 1; i++) a = 0; } k = bar(d, 1); d = bar(1, k); } } } void baz() { foo(0); } int main() { foo(0); printf("%d\n", c); return 0; }