[Bug c++/54498] New: incorrect code generation from g++ -O on x86_64

stevenj at alum dot mit.edu gcc-bugzilla@gcc.gnu.org
Wed Sep 5 21:50:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54498

             Bug #: 54498
           Summary: incorrect code generation from g++ -O on x86_64
    Classification: Unclassified
           Product: gcc
           Version: 4.7.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: stevenj@alum.mit.edu


Created attachment 28136
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28136
preprocessed source exhibiting the problem

The attached preprocessed source (bug.ii) illustrates an apparent incorrect
code generation when it is compiled with g++ -O version 4.7.1 on x86_64 (Debian
GNU/Linux).

The program executes two iterations of a loop, calling a function that returns
two slightly different complex numbers in the two iterations.  After the second
iteration, it prints the absolute value of the difference.  The correct output
(when compiled without optimization) is:

   ft (it = 0) = -491.697+887.05i
   ft (it = 1) = -491.692+887.026i
   abs(ft - prev_ft) = 0.0245153

(0.0245153 is the correct absolute difference of the two previous numbers.) 
When compiled with -O, it produces:

   ft (it = 0) = -491.697+887.05i
   ft (it = 1) = -491.692+887.026i
   abs(ft - prev_ft) = 491.692

Note that the first two numbers are the same, but the absolute value of the
difference is wrong.

The problem disappears if I use g++ 4.4.5, or if I make minor changes to the
code; I've tried to boil it down to the minimal code that exhibits the problem.

Steven

PS. The preprocessed source is rather long only because it #includes <stdio.h>
and <complex>; the program source at the end is quite short.

PPS. Some of my g++ -v output follows, indicating the g++ configuration options
etcetera:

Target: x86_64-unknown-linux-gnu
Configured with: ../configure
--prefix=/home/stevenj/downloads/gcc/gcc-4.7.1/OBJ/../local --disable-multilib
--enable-languages=c,c++
GNU C++ (GCC) version 4.7.1 (x86_64-unknown-linux-gnu)
    compiled by GNU C version 4.7.1, GMP version 4.3.2, MPFR version 3.0.0-p3,
MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072



More information about the Gcc-bugs mailing list