This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Weird optimization bug


Hi all,

Before filling a bug report, I'd like to have some comments here, at
least so I can write a better test case and description.

This test case is from lapack. I noticed that I had to compile a
particular subroutine (dlamc1) with -O0, otherwise the programs using
it would hang. So I made this program that just uses dlamc1 (it's
fixed-format, I hope the mailing system preserves spaces):

C=============================================
      PROGRAM Test
        IMPLICIT NONE
        LOGICAL :: LIEEE1, LRND
        INTEGER :: LBETA, LT

        CALL DLAMC1( LBETA, LT, LRND, LIEEE1 )

        WRITE(6,*) LBETA, LT, LRND, LIEEE1

      END PROGRAM Test

      SUBROUTINE DLAMC1( BETA, T, RND, IEEE1 )
      LOGICAL            IEEE1, RND
      INTEGER            BETA, T
      LOGICAL            FIRST, LIEEE1, LRND
      INTEGER            LBETA, LT
      DOUBLE PRECISION   A, B, C, F, ONE, QTR, SAVEC, T1, T2
      DOUBLE PRECISION   DLAMC3
      EXTERNAL           DLAMC3
      SAVE               FIRST, LIEEE1, LBETA, LRND, LT
      DATA               FIRST / .TRUE. /
      INTEGER I
      IF( FIRST ) THEN
         FIRST = .FALSE.
         ONE = 1
         A = 1
         C = 1
   10    CONTINUE
         IF( C.EQ.ONE ) THEN
            A = 2*A
            C = DLAMC3( A, ONE )
            C = DLAMC3( C, -A )
            GO TO 10
         END IF
         B = 1
         C = DLAMC3( A, B )
C         WRITE(6,*) 'Hi'
   20    CONTINUE
         IF( C.EQ.A ) THEN
            B = 2*B
            C = DLAMC3( A, B )
            GO TO 20
         END IF
         QTR = ONE / 4
         SAVEC = C
         C = DLAMC3( C, -A )
         LBETA = C + QTR
         B = LBETA
         F = DLAMC3( B / 2, -B / 100 )
         C = DLAMC3( F, A )
         IF( C.EQ.A ) THEN
            LRND = .TRUE.
         ELSE
            LRND = .FALSE.
         END IF
         F = DLAMC3( B / 2, B / 100 )
         C = DLAMC3( F, A )
         IF( ( LRND ) .AND. ( C.EQ.A ) )
     $      LRND = .FALSE.
         T1 = DLAMC3( B / 2, A )
         T2 = DLAMC3( B / 2, SAVEC )
         LIEEE1 = ( T1.EQ.A ) .AND. ( T2.GT.SAVEC ) .AND. LRND
         LT = 0
         A = 1
         C = 1
   30    CONTINUE
         IF( C.EQ.ONE ) THEN
            LT = LT + 1
            A = A*LBETA
            C = DLAMC3( A, ONE )
            C = DLAMC3( C, -A )
            GO TO 30
         END IF
      END IF
      BETA = LBETA
      T = LT
      RND = LRND
      IEEE1 = LIEEE1
      RETURN
      END

      DOUBLE PRECISION FUNCTION DLAMC3( A, B )
      DOUBLE PRECISION   A, B
      DLAMC3 = A + B
      RETURN
      END
C=============================================

$ gfortran -O0 test.f ; ./a.out
           2          53 T T

This is fine, but then:

$ gfortran -O1 test.f ; ./a.out
[the program runs with 100% cpu for at least one minute, ctrl+C]

Oddly enough, if I now uncomment the WRITE just before line labeled 20:

$ gfortran -O1 test.f ; ./a.out
 Hi
           2          53 F F

So, I would say it was a too-sensitive-to-optimization thing, but
fixing it with a WRITE tells me it must be a bug. Don't you think so?

My system:

$ gfortran -v
Using built-in specs.
Target: i386-pc-linux-gnu
Configured with: /home/fx/gfortran_nightbuild/trunk/configure
--prefix=/home/fx/gfortran_nightbuild/irun-20070930
--enable-languages=c,fortran --build=i386-pc-linux-gnu
--enable-checking=release
--with-gmp=/home/fx/gfortran_nightbuild/software
Thread model: posix
gcc version 4.3.0 20070930 (experimental) [trunk revision 128889] (GCC)

$ uname -a
Linux djelibeibi 2.6.17-14mdv #1 SMP Wed May 9 21:11:43 MDT 2007 i686
AMD Athlon(tm) XP 2800+ GNU/Linux

Thanks
Ignacio


      ___________________________________________________________
Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
now.
http://uk.answers.yahoo.com/ 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]