This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Optimizer bug (scheduler problem?) in latest ss
- To: egcs-bugs at egcs dot cygnus dot com
- Subject: Optimizer bug (scheduler problem?) in latest ss
- From: Martin Kahlert <martin dot kahlert at mchp dot siemens dot de>
- Date: Wed, 24 Nov 1999 09:13:35 +0100
Hi,
the lastest snapshot produces wrongly optimized code.
This error inhibits the correct run of my circuit simulation code.
The program is in Fortran, but the error should be in the optimizer
part of gcc.
gcc -v:
Reading specs from /usr/local/snapshots/lib/gcc-lib/i686-pc-linux-gnu/2.96/specs
gcc version 2.96 19991110 (experimental)
To reproduce the bug do:
g77 -O2 -fomit-frame-pointer -c bug.f
g77 -O2 -fomit-frame-pointer -o bug main.f bug.o
You have to compile it from two separate files!
I marked the two wrongly optimized lines:
IZTREE = IBAUM+NUMNOD
IZTEND = IZTREE + 4*NCNOD1
>From the error output and the debugger trace
it seems to be optimized into something like
IZTREE = NUMNOD
IZTEND = IZTREE + 4*NCNOD1
IZTREE = IZTREE + IBAUM
which is clearly wrong.
cat main.f:
SUBROUTINE GETM(X)
INTEGER*4 X
X = 1
RETURN
END
SUBROUTINE ZERO(X)
INTEGER*4 X
RETURN
END
CALL BUG(2,3,4,1,0)
END
cat bug.f:
C CALLED WITH 2 3 4 1 0
SUBROUTINE BUG(NUMNOD,JELCNT,IQCU,IPOS,FLTSIM)
IMPLICIT NONE
CHARACTER*256 STRING
INTEGER*4 NUMVS,JELCNT,IQLO,IQDC,IQDCS,IEQUA,NCNOD1,NUMNOD,IHILF,
* LILO,LILOS,LIDC,LIDCS,LICU,IPART,IQCU,INZBR,IQHNO,IHAUF,
* IBAUM,NODPLC(10),IZLO,IZLOS,
* IZDC,IZDCS,IZCU,IZHAUF,NATIEF,NUMRZ,NZBRCH,IZTREE,
* IZTEND,IZB,K1,K2,IH1,IH2,N2,IPOS,FLTSIM,N1,IPN1,IPN2
STRING(1:3) = 'R "'
NUMVS = JELCNT
IQLO = NUMVS
IQDC = JELCNT
IQDCS = JELCNT
CALL GETM(IEQUA)
NCNOD1 = NUMNOD - 1
CALL GETM(IHILF)
LILO = IHILF
LILOS= IQLO
LIDC = LILOS
LIDCS= IQDC
LICU = LIDCS+ IQDCS
IPART= LICU + 2*IQCU
INZBR= IPART
IQHNO= IPART
IHAUF= IPART + NUMNOD
IBAUM= IHAUF + 2*IQLO
CALL ZERO(NODPLC(INZBR+1))
CALL ZERO(NODPLC(IHAUF+1))
WRITE(*,*)'IBAUM = ',IBAUM
IZLO = LILO
IZLOS= LILOS
IZDC = LIDC
IZDCS= LIDCS
IZCU = LICU
IZHAUF=IHAUF
NATIEF=0
NUMVS = 0
NUMRZ = 0
NZBRCH = 0
CALL ZERO(NODPLC(IPART+1))
CALL ZERO(NODPLC(IBAUM+1))
C HERE ARE THE TWO BUGGY LINES:
IZTREE = IBAUM+NUMNOD
IZTEND = IZTREE + 4*NCNOD1
IZB=LILO
4100 IF(IZB.EQ.LILO) THEN
IF(IZTREE .GE. IZTEND) THEN
WRITE(*,*) 'ERROR'
WRITE(*,*) ' IBAUM=',IBAUM
WRITE(*,*) ' NCNOD1=',NCNOD1
WRITE(*,*) ' NUMNOD=',NUMNOD
WRITE(*,*) ' IZTEND=',IZTEND
ELSE
WRITE(*,*) 'NO ERROR'
ENDIF
STOP
ENDIF
4200 IF (IZB .EQ. LICU) THEN
K1 = 1
IH1 = NODPLC(IPART+K1)
4210 IF (IH1 .GT. 0) THEN
K1 = IH1
IH1=NODPLC(IPART+K1)
GOTO 4210
ENDIF
DO 4290 N2=2,NUMNOD
K2 = N2
IH2 = NODPLC(IPART+K2)
4220 IF (IH2 .GT. 0) THEN
K2 = IH2
IH2=NODPLC(IPART+K2)
GOTO 4220
ENDIF
IF (K1 .NE. K2) THEN
IF(FLTSIM.NE.0) THEN
WRITE(*,*) STRING(1:IPOS)
ELSE
WRITE(*,*) STRING(1:IPOS)
ENDIF
ENDIF
4290 CONTINUE
ELSEIF (IZB .EQ. LIDCS) THEN
K1 = 1
IH1 = NODPLC(IPART+K1)
4310 IF (IH1 .GT. 0) THEN
K1 = IH1
IH1=NODPLC(IPART+K1)
GOTO 4310
ENDIF
DO 4390 N2=2,NUMNOD
K2 = N2
IH2 = NODPLC(IPART+K2)
4320 IF (IH2 .GT. 0) THEN
K2 = IH2
IH2=NODPLC(IPART+K2)
GOTO 4320
ENDIF
4390 CONTINUE
ENDIF
IZB=IZB+2
N1=NODPLC(IZB-1)
N2=NODPLC( IZB )
K1 = N1
IH1 = NODPLC(IPART+K1)
4410 IF (IH1 .GT. 0) THEN
K1 = IH1
IH1=NODPLC(IPART+K1)
GOTO 4410
ENDIF
K2 = N2
IH2 = NODPLC(IPART+K2)
IZTREE=IZTREE+4
IPN1 = IBAUM + N1
IPN2 = IBAUM + N2
NODPLC(IZTREE-3) = NODPLC(IPN1)
NODPLC(IZTREE-2) = IZB
NODPLC(IZTREE-1) = NODPLC(IPN2)
NODPLC( IZTREE ) = IZB
NODPLC(IPN1) = IZTREE-3
NODPLC(IPN2) = IZTREE-1
GO TO 4100
RETURN
END
Bye,
Martin.
PS: Thanks for the great compiler!
The least i can do to improve it is to generate bug reports from
my big code base. These two files are heavily stripped down versions
from much larger files. I couldn't leave out more without eliminating
the bug.