http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49071
Summary: Wrong code with -fschedule-insns (x86-64) Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: arthur.j.odw...@gmail.com Created attachment 24295 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24295 Output of "gcc -O1 -fschedule-insns test.c -v" with GCC 4.4.5 This bug reproduces all the way back to at least 4.4.5, and also reproduces with trunk revision 173843 (2011-05-17). I'm on Ubuntu 10.10, x86-64. cat >test.c <<EOF #include <stdio.h> #pragma pack(1) struct S0 { int f0; int f1; unsigned f3 : 6; int f4; int f5; unsigned f6 : 23; unsigned f8 : 10; }; static struct S0 g_12 = {0}; static struct S0 g_361 = {0,0,0,0,0,0,55}; static unsigned char g_547 = 1; static int func_66() { g_12.f8 |= 1; return g_12.f6; } static struct S0 func_1(void) { int p; for (p = 2; p >= 0; --p) g_547 = 2; g_361.f8 &= func_66(); return (struct S0){0}; } int main() { func_1(); printf("", (unsigned)g_361.f6); printf("%x\n", (unsigned)g_547); return 0; } EOF gcc -O1 test.c ; ./a.out // correctly prints "2" gcc -O2 test.c ; ./a.out // incorrectly prints "1" You can replace "-O2" with "-O1 -fschedule-insns" and see the same wrong code generated. This test case is reduced from the output of Csmith 2.1.0 (git hash 01aa8b04, https://github.com/Quuxplusone/csmith/), using the following command line: csmith --paranoid --longlong --no-pointers --arrays --no-jumps --no-consts --no-volatiles --checksum --divs --no-muls --bitfields --packed-struct -s 591872179