http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48966
Summary: gcc 4.5 gets wrong answer at -O2 Product: gcc Version: 4.5.3 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: g...@cray.com The following test gets the wrong answer for optimization level -O2 (and -O3) for GCC 4.5.3. The correct answer occurs when -O1 is used. The problem does occur in GCC 4.6.0: $ cat ptest.c #include <stdio.h> double d0 = 0.49999999999999999; double d1 = 0.99320549518091861; double d2 = 0.00674833952334470; double d3 = 0.00679450481908144; int main() { double tmp; int answer = 0; tmp = d3 - d2/(d1-d0) - d0; answer = (*(((int *)&tmp)+1) >> 31) & 1; printf("answer = %d\n",answer); return answer; } $ gcc --version gcc (GCC) 4.5.3 20110428 (Cray Inc.) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc -O1 ptest.c && ./a.out answer = 1 $ gcc -O2 ptest.c && ./a.out answer = 0 <----------- Wrong answer!!! $ module swap gcc/4.5.3 gcc/4.6.0 $ gcc --version gcc (GCC) 4.6.0 20110325 (Cray Inc.) Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. geir@kaibab:/lus/scratch/geir/ISU/ISU3475> gcc -O2 ptest.c && ./a.out answer = 1 $ The processor being used is: $ grep "model name" /proc/cpuinfo model name : 6-Core AMD Opteron(tm) Processor 23 (D0) model name : 6-Core AMD Opteron(tm) Processor 23 (D0) model name : 6-Core AMD Opteron(tm) Processor 23 (D0) model name : 6-Core AMD Opteron(tm) Processor 23 (D0) model name : 6-Core AMD Opteron(tm) Processor 23 (D0) model name : 6-Core AMD Opteron(tm) Processor 23 (D0) $