[comp.sys.sgi] IRIX 3.3.1 f77 -O2 bug

glennrp@BRL.MIL (Glenn Randers-Pehrson, TBD|WMB) (01/16/91)

Here's a complete example of the second type of bug I described earlier.
The optimizer has not noticed that IFN was changed in loop 12.
This was done on a 220GTX running IRIX 3.3.1

Script started on Tue Jan 15 12:46:22 1991
taylor.brl.mil> cat bug331.f
      PROGRAM BUG331
      DIMENSION K1(3),K2(3)
      COMMON /A/ LINNB(2), NPLIN(2)
      data    k1/2, 0, 1/
      data    k2/3, 0, 1/
      data linnb/1, 0/
      data nplin/2, 0/
      CALL       SUB1(K1,K2)
      STOP
      END

      SUBROUTINE SUB1(K1,K2)
      DIMENSION K1(1),K2(1)
      COMMON /B/ IFN,KOEF(2)
      COMMON /A/ LINNB(2), NPLIN(2)
      DO 11 J=1,3
   11 KOEF(J-1)=K1(J)
      GO TO (4050,4040,4050),IFN
 4040 CONTINUE
      IC=KOEF(2)
      II=LINNB(IC)
      CALL SUB2(ic,ii,1)
 4050 CONTINUE
      DO 12 J=1,3
   12 KOEF(J-1)=K2(J)
      GO TO (5050,5040,5050),IFN
 5040 CONTINUE
      IC=KOEF(2)
      II=LINNB(IC)
      CALL SUB2(ic,ii,2)
 5050 CONTINUE
  100 CONTINUE
      RETURN
      END

      SUBROUTINE SUB2(IC,II,iflag)
      write(*,*)' sub2: iflag=',iflag
      write(*,*)'       ic=',ic
      write(*,*)'       ii=',ii
      RETURN
      END
taylor.brl.mil> f77 -O1 nynew.f
taylor.brl.mil> a.out
  sub2: iflag=           1
        ic=           1
        ii=           1
taylor.brl.mil> f77 -O2 nynew.f
taylor.brl.mil> a.out
  sub2: iflag=           1
        ic=           1
        ii=           1
  sub2: iflag=           2
        ic=           1
        ii=           1
taylor.brl.mil>
script done on Tue Jan 15 12:47:00 1991

Note that sub2 is erroneously called a second time, with ifn=3.  The
optimizer thinks ifn is still 2.

...Glenn Randers-Pehrson <glennrp@brl.mil>