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]

AltStyle によって変換されたページ (->オリジナル) /