The following program: /*----------8<-----------------------*/ int printf(const char *, ...);
int f(void) { return 0; } void g(int a[]) { int n3, n0; int even; int diff = a[1] - a[0]; n3 = 3; if ((n0 = f()) > 0) { even = diff + 2 * (n3 - n0); } else { even = diff + 2 * n3 + 1; if (even > 0) even++; else if (even < 0) even--; } if (even % 2 == 0) { printf("OK! even = %d\n", even); } else { printf("WRONG! even = %d\n", even); } } int main(void) { int a[2] = {46, 16}; g(a); return 0; } /*----------8<-----------------------*/ when compiled with: $ gcc-3.4.3 bug.c -o bug -O2 -march=i686 displays when executed: WRONG! even = -23 whereas when compiled with: $ gcc-3.4.3 bug.c -o bug -O2 gives the expected output: OK! even = -24 The bug is also exhibited when some others -march options are used, like -march=athlon-xp. gcc-3.4.3 -v output is: Reading specs from /home/richard/programs/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/specs Configured with: /home/richard/tmp/gcc/gcc-3.4.3/configure --prefix=/home/richard/programs/gcc-3.4.3 --program-suffix=-3.4.3 --enable-threads=posix --enable-languages=c,c++ Thread model: posix gcc version 3.4.3 bug.i: # 1 "bug.c" # 1 "<built-in>" # 1 "<command line>" # 1 "bug.c" int printf(const char *, ...); int f(void) { return 0; } void g(int a[]) { int n3, n0; int even; int diff = a[1] - a[0]; n3 = 3; if ((n0 = f()) > 0) { even = diff + 2 * (n3 - n0); } else { even = diff + 2 * n3 + 1; if (even > 0) even++; else if (even < 0) even--; } if (even % 2 == 0) { printf("OK! even = %d\n", even); } else { printf("WRONG! even = %d\n", even); } } int main(void) { int a[2] = {46, 16}; g(a); return 0; } -- Summary: -march=i686 generates a bogus program Product: gcc Version: 3.4.3 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: abulmo at club-internet dot fr CC: gcc-bugs at gcc dot gnu dot org GCC host triplet: gcc-3.4.3/gentoo-linux/athlon-xp 2500+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19579