This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


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

Optimizer bug (scheduler problem?) in latest ss


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.


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