The program below is miscompiled using
gfortran -O2 -o m m.f90; ./m
gives:
y=   0.60653065945526063       2*y=   2.0000000000000000

(the second of the printed numbers should equal twice the first). Using
gfortran -fno-inline -O2 -o m m.f90
works OK.

The compiler is:

Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: /home/jerry/gcc/trunk/configure --prefix=/usr/local/gfortran
--enable-languages=c,fortran --disable-libmudflap --enable-libgomp
--disable-shared
Thread model: posix
gcc version 4.5.0 20090831 (experimental) [trunk revision 151238] (GCC)



program m

   double precision :: y,z

   call b(1.0d0,y,z)
   print*,'y= ', y, ' 2*y=', z

contains

     subroutine b( x, y, z)
       implicit none

       double precision :: x,y,z

       integer :: i, k
       double precision :: h, r

       y = 1.0d0
       z = 0.0d0

       h = 0
       DO k = 1,10
          h = h + 1.0d0/k

          r = 1
          DO i = 1,k
             r = (x/(2*i) ) * r
          END DO

          y = y + (-1)**k * r
          z = z + (-1)**(k+1) * h * r

          IF ( ABS(2*k/x*r) < 1d-6 ) EXIT
       END DO

       z = 2*y
     end subroutine b
end program m


-- 
           Summary: miscompilation  at  -O2
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jpr at csc dot fi


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

Reply via email to