gcc optimizer problem

Claus Kleinwort kleinwrt@mail.desy.de
Mon Apr 6 12:20:00 GMT 1998


 GCC Optimizer Problem
=======================

Dear EGCS developers,

I'm a member of a large collaboration performing research in high energy 
physics ( http://www-h1.desy.de ) and I have a problem with the GCC
optimizer for some Fortran code on a PC running Linux. The code performs
only correct without optimization (-O0).

I've tried the following versions without success:

 1) g77 0.5.19 + gcc 2.7.2 (our default) 
 2) f2c        + gcc 2.8.1
 3) egcs 1.0.2
 
The compiler options used are:
 g77 -c -w -fno-automatic -finit-local-zero -O2 -fno-second-underscore 
     -fno-backslash
 gcc -c -w -ansi -O2
 
The troubled routine is part of some pattern recognition program. With
optimization it finds for some input not the best solution but only the 
second best coming first. Therefore it seems to me that a loop is
terminated too early. Without optimization or by placing a PRINT statement
in some loop (see comment: CHK the magic print statement) the best
solution is found.

      Could you have a look into this problem ?
      
                Thanks  Claus Kleinwort

The Fortran code:

*CMZU:  8.11/01 20/10/97  10.15.33  by  Claus Kleinwort
*CMZ :  8.04/00 27/06/96  20.28.36  by  Stephen Burke
*CMZU:  3.06/02 16/09/92  13.53.37  by  C. Kleinwort
*-- Author :    C. Kleinwort   11/12/91
*
* The descriptions inserted below will appear asis with the
* initial asterisk removed in the WWW writeup. HTML commands
* (links etc.) may be included in the description if desired.
* The regions can be expanded to as many comment lines as
* required up to a maximum of 100 from *HTMLP to *HTMLE inclusive.
*
*HTMLP     : Describe the Purpose of the routine
*
*
*
*HTMLI     : Describe the Input variables to the routine
*
*
*
*HTMLO     : Describe the Output of the routine
*
*
*
*HTMLE     : Terminates the HTML documentation
*
      SUBROUTINE IXCLU1(ISEG,ICLUS,NIN,ITHETA,IRHO,LYRMSK)
C--------------------------------------------------------------------
C
C  PURPOSE: IRON PATREC II, FIND MAXIMUM IN THETA CLUSTER
C                           1.=SIMPLEST APPROACH
C
C  CALLED BY: IXFILT
C
C  CALLS:
C
C  INPUT:
c    ISEG      : SEGMENT
c    ICLUS     : THETA CLUSTER
C  OUTPUT:
C    NIN       : ENTRIES IN CLUSTER MAXIMUM
C    ITHETA    : THETA POSITION OF CLUSTER MAXIMUM (1 BIN)
C    IRHO      : RHO   POSITION OF CLUSTER MAXIMUM (CENTER,1.,LAST)
C    LYRMSK    : LAYER MASK OF CLUSTER MAXIMUM
C
C  CHANGES:
C    NEW ISOLATION DIRECTION: (-1,-1),(+1,+1), OLD (-1,0),(+1,0)
C
C  16.09.92 C.KLEINWORT: MINIMIZE RELATIVE NOT ABSOLUTE ISOLATION
C
C--------------------------------------------------------------------
*
*KEEP,BOSMDL.
C     ------BOSMDL
      LOGICAL       BEGJOB,ENDRUN,BEGRUN,REVENT,ENDJOB,OTHDAT
      COMMON/BOSMDL/BEGJOB,ENDRUN,BEGRUN,REVENT,ENDJOB,OTHDAT,
     +              LCCRUN,NCCRUN,NEVENT,
     +              IHA,IBS,IDB,IDATEL,LUP,ISN,JSN
      SAVE  /BOSMDL/
C     ------
*KEND.
*
*KEEP,IPGPM.
*----------------------------------------------------------------
*
* Macro definitions for new ITREC pattern recognition
*
*----------------------------------------------------------------
*********************************************************
* C. Kleinwort,  7.01.92:                               *
* General parameter for new pattern recognition         *
*********************************************************
*
      REAL    CUNIT,EUNIT
*
*     Max number of hit types (wires,strips,towers,...)
      PARAMETER (MWST=2)
*     Number of hit types including towers
      PARAMETER (MWSTWR=3)
*     for INTEGER coordinates ONE=CUNIT (--> mm)
      PARAMETER (CUNIT=10.)
*     Max number of hits in association
      PARAMETER ( MAXHIT=25 )
*     Max level for IXCLU
      PARAMETER ( MAXLEV=2 )
*     Min number of module groups
      PARAMETER ( MINMGR=5 )
*     Segmentation of HOUGH plot:
      PARAMETER (MSEG=3)
*     Number of "Theta" bins:
      PARAMETER (MTHETA=200)
*     Number of "Rho" bins:
      PARAMETER (MRHO=50)
*     Scaling factor for "fine: rho bins
      PARAMETER (IRFAC=10)
*     Number of columns for HOUGHX
      PARAMETER (MX=4)
*     for INTEGER (EX,EY) ONE=EUNIT
      PARAMETER (EUNIT=10000.)
*     For fractional hits in HOUGH plot
      PARAMETER (MUNIT=12)
*     Max number of associations:
      PARAMETER (MAXASS=100)
*     Max number of wire-strip-tower links
      PARAMETER (MXLWST= 50)
*     Max number of link candidates
      PARAMETER ( MAXLC=100 )
*     Max number of link qualities
      PARAMETER ( MAXLQ=2 )
*
*     VTXG          : VERTEX-COORDINATES (GOBAL)
*     ITSCI         : SCINTI-TRIGGER-FLAG ( COSMICS ONLY )
*
      DIMENSION NMGR(MWST),IMGR1(3),VTXG(3)
*
      COMMON / IPGPC  /
     +   NMGR,IMGR1,IMGR,IWST,IBCF,LEVEL,INIMSK,VTXG,ICSTRG
*
*KEEP,IPSTM.
*********************************************************
* C. Kleinwort, 10.03.92:                               *
* new IRON pattern recognition: parameter               *
*********************************************************
*
      COMMON / IPSTC / MINLYR(MWST),MININ(MWST),MAXSD(MWST,2),WPLMX1,
     &  WRES,WEFF,DYMAXW,GAPSBA,GAPSEC,GAPOBA,MAXGAP(0:MAXLEV),
     &  MAXDLW(0:MAXLEV,2),PCUTW(0:MAXLEV),SRES,PCUTS,MAXDLS(0:MAXLEV),
     &  TNCUT,TSIZE1,TSIZE2,STRCUT,STRCOR,STRMN,STRSG2,
     &  DXCUTW(2),DYCUTW(4,2),MAXLDL(2),DYMAXL(MWST),DYCUTL(2,MWST),
     &  MINNFE,WPLCOR,WPLMX2,QPTMAX,IHGHDF(3,2),HGHDEF(9),
     &  MAXSZ(2),MAXTL(2)
*
*KEEP,IPCLM.
*********************************************************
* C. Kleinwort,  5.12.91:                               *
* Cluster stuff, lists of (un)associated hits,..        *
*********************************************************
*
      INTEGER NWU(4,0:12,MWST),NTU(2,3),NASS(3,3,MWSTWR)
*     NWU(1,IMGR,IWST): Number of unass. hits, (in this Module GRoup,
*     NWU(2,IMGR,IWST): pointer to first hit    and of this hit type)
*     NWU(3,IMGR,IWST): IBCF
*     NWU(4,IMGR,IWST): Octant with X-axis (barrel only)
*     NTU(1,IBCF)     : Number of unass. towers for this IBCF
*     NTU(2,IBCF)     : pointer to first tower
*     NASS(1,   ): Number of associations for this IBCF, IWST
*     NASS(2,   ): pointer to first association
*     NASS(3,   ): pointer to last  association
      COMMON / IPCLC  / NWU,NTU,NAST,NASS,NLWST
*
*KEEP,IPCFM.
*********************************************************
* C. Kleinwort,  5.12.91:                               *
* Some definitions for new pattern recognition:         *
*    CONFORMAL MAPPING                                  *
*********************************************************
      INTEGER NTHCL(2)
*     NTHETA        : #THETA-BINS USED (<= MTHETA)
*     NRHO          : #RHO  -BINS USED (<= MRHO  )
*     NINTHE        : #HITS INSIDE THETA RANGE
*     NINRHO        : #ENTRIES IN HOUGH PLOT
*     ILBIN,IHBIN   : FIRST,LAST THETA BIN CHANGED
*     RANGE(IBCF,1,): MAX(THETA) for backward, central, forward
*     RANGE(IBCF,3,): MIN(THETA) for backward, central, forward
*     STEP (IBCF,1,): DTHETA     for backward, central, forward
*     RANGE(IBCF,2,): MAX(RHO)   for backward, central, forward
*     STEP (IBCF,2,): DRHO       for backward, central, forward
*     NTHCL         : NUMBER OF CLUSTER IN THETA, POINTER TO FIRST
      REAL    RANGE(3,3,MWST), STEP(3,2,MWST)
      INTEGER EXH(3*MWST,MTHETA), EYH(3*MWST,MTHETA)
*
      COMMON / IPCFC / NTHETA,NRHO,NRHOHF,NINTHE,NINRHO,NTHCL,
     &                 RANGE,STEP,EXH,EYH,ILBIN,IHBIN
*
*KEEP,IPHLM.
*********************************************************
* C. Kleinwort, 20.01.92:                               *
* (temporary) hit lists (current and current best cand.)*
*********************************************************
*
      DIMENSION  IHLIST(0:MAXHIT,2), IHPAR(3,2), RHPAR(3,2), IHLBAD(2),
     &           IHQUAL(2)
      LOGICAL LHSAME
*
*     NHLIST: 1,2 current list to use
*     IHLBAD: bit mask for bad hits (MAXHIT<32 !!!)
*     IHPAR : layer mask, #layers, #gaps
*     RHPAR : mean and max triplett residual, chi2
*
      COMMON / IPHLC / NHLIST,IHLIST,IHLBAD,IHPAR,RHPAR,LHSAME,IHQUAL
*
*KEEP,IPH1WM.
*********************************************************
* C. Kleinwort, 10.03.92:                               *
* new IRON pattern recognition: large commons in H1WORK *
*********************************************************
*
* Some stuff for the associations
      INTEGER NWA(4,MAXASS)
      INTEGER LWASS(5,MAXASS),MWASS(4,MAXASS),IQWASS(MAXASS)
      INTEGER ILWST(4,MXLWST),LWLNK(MAXASS),MGRASS(MAXASS)
      REAL    PWASS(10,MAXASS)
*     NWA(1,    ): Number of ass. hits,
*     NWA(2,    ): pointer to first hit
*     NWA(3,    ): pointer to next association
*     NWA(4,    ): pointer to previous association
*     LWASS(1,  ): Number of layers
*     LWASS(2,  ): First layer
*     LWASS(3,  ): Last  layer
*     LWASS(4,  ): Layer mask
*     LWASS(5,  ): Layer mask for layer with >1 hit
*     MWASS(1,  ): module mask (0-15 for B,C and F each) inner mu
*     MWASS(2,  ): module mask iron
*     MWASS(3,  ): module mask outer mu
*     MWASS(4,  ): module mask all layers
*     IQWASS(   ): quality bits (0-3:IWST,4-7:IBCF,8-11:ISEG,12-15:QUAL)
*     MGRASS(   ): module group for this ass.
*     PWASS(1,  ): Y(X=0) at first hit
*     PWASS(2,  ): Y(X=0) at last  hit
*     PWASS(3,  ): DY/DZ  at first hit
*     PWASS(4,  ): DY/DZ  at last  hit
*     PWASS(5,  ): X first layer
*     PWASS(6,  ): X last  layer
*     PWASS(7,  ): Y first layer
*     PWASS(8,  ): Y last  layer
*     PWASS(9,  ): <X> for fit with first hits
*     PWASS(10, ): <X> for fit with last  hits
*     ILWST(1,  ): wire ass.
*     ILWST(2,  ): strip ass. linked to wire ass.
*     ILWST(3,  ): tower ass. linked to wire ass.
*     ILWST(4,  ): next link for this wire ass./ MUID result
* Stuff for the HOUGH plot(s)
      INTEGER HOUGHN(MRHO,MTHETA,MSEG)
      INTEGER HOUGHL(MRHO,MTHETA)
      INTEGER HOUGHX(MX,MTHETA,MSEG)
      INTEGER HOUGHT(MTHETA)
      INTEGER LTHCL(5,MTHETA)
*     HOUGHL        : LAYER MASK (BIT PATTERN)
*     HOUGHX(,,1)   : SUM OF HOUGHN(,,IRHO) (IRHO=1,MRHO)
*     HOUGHX(,,2)   : MAX OF HOUGHN(,,IRHO) (IRHO=1,MRHO)
*     HOUGHX(,,3)   : FIRST RHO-BIN WITH MAX OF HOUGHN(,,IRHO)
*     HOUGHX(,,4)   : LAST  RHO-BIN WITH MAX OF HOUGHN(,,IRHO)
*     LTHCL(1,)     : FIRST THETA BIN IN CLUSTER
*     LTHCL(2,)     : LAST  THETA BIN IN CLUSTER
*     LTHCL(3,)     : POINTER TO NEXT CLUSTER
*     LTHCL(4,)     : POINTER TO PREVIOUS CLUSTER
*     LTHCL(5,)     : THETA BIN WITH MAX ENTRY
* Link stuff, lists of link candidates,...              *
      DIMENSION  ILIST(MAXLC,6),LNKCND(MAXLQ,MAXASS),LINKS(MAXASS),
     &           RLIST(MAXLC,2)
*
      COMMON / H1WORK /
     &                 NWA,LWASS,PWASS,MWASS,IQWASS,MGRASS,
     &                 ILWST,RLWST,LWLNK,
     &                 ILIST,RLIST,LNKCND,LINKS,
     &                 HOUGHN,HOUGHL,HOUGHX,HOUGHT,LTHCL
*
*KEND.
*
      LOGICAL BTEST
*
      INTEGER H1N(MRHO*MTHETA*MSEG)
      EQUIVALENCE (HOUGHN(1,1,1),H1N(1))
*
      PARAMETER (MAXIN=MAXHIT*MUNIT)
*
      PARAMETER (IXSTP=MRHO+1)
*
      PARAMETER (MAXOLD=10)
*
*     number of bins around max in rho to try too
*
      PARAMETER (NTAIL=1)
*
      INTEGER MASK(MSEG), IRHO(3), JRHO(3)
      INTEGER ITHOLD(MAXOLD),IRHOLD(MAXOLD),NINOLD(MAXOLD)
*
CHEX  DATA MASK / zF0000FFF, zF0FFF000, zF0FFFFFF /
      DATA MASK / -268431361, -251662336, -251658241 /
      DATA NTHOLD / 0 /
                  PRINT *, ' IXCLU1- '
*
*     minimum required in maximum
*
      MININS=MININ(IWST)
*
*     maximum allowed in side bins
*
      MAXSD2=MAXSD(2,IWST)
*
*     maximum allowed in side bins in different layers
*
      MAXSD1=MAXSD(1,IWST)
*
*     init again?
*
      IF (BTEST(INIMSK,1)) THEN
         INIMSK=IBCLR(INIMSK,1)
         NTHOLD=0
      ENDIF
*
*     reset hit lists
      IHLIST(0,1)=0
      IHLIST(0,2)=0
*
      MSK=MASK(ISEG)
      NCAND=0
      NIN=-1
      MTOLD=-1
      FRACX=0.0
*
      MALL=NWU(1,IMGR,IWST)*MUNIT
*
      ILB=LTHCL(1,ICLUS)
      IHB=LTHCL(2,ICLUS)
      IXB=LTHCL(5,ICLUS)
      ITO=0
      IRO=0
*
*     try to restart with some old good candidate
*
      IF (NTHOLD.GE.1) THEN
*
         DO 100 I=NTHOLD,1,-1
*
            NTO=NINOLD(I)
*           still available ?
            IF (NTO.LE.0) GOTO 100
*
            ITO=ITHOLD(I)
            IRO=IRHOLD(I)
*           still same maximum ?
            IF (HOUGHX(2,ITO,ISEG).NE.NTO) GOTO 100
*
            IXB=ITO
CCC         PRINT *, ' IXCLU1 OLD CAND: ', I, ITO, IRO, NTO
*           flag as used
            NINOLD(I)=0
            GOTO 101
*
  100    CONTINUE
*
  101    CONTINUE
*
      ENDIF
*
      NB=MAX(IXB-ILB,IHB-IXB)
      ISB=IXB-NB
      IEB=2*IXB+1
*
      IXIS=(ISEG-1)*MTHETA*MRHO
      IXISTL=IXIS+(ILB-1)*MRHO+1
      IXISTH=IXIS+IHB*MRHO
*
*     loop over all theta bins of interest
*
      DO 1000 JT=IXB,ISB,-1
*
         IT=JT
*
         DO 950 KT=1,2
*
            IF (IT.LT.ILB.OR.IT.GT.IHB) GOTO 900
*
            MT=HOUGHX(2,IT,ISEG)
            IF (MT.LT.MININS) GOTO 900
            IF (MT.GT.MAXIN) GOTO 900
*
*           candidate in THETA, check now isolation in THETA-RHO plane
*
            IXIST=IXIS+(IT-1)*MRHO
*
*           loop over all rho bins of interest
*
            IR1=MAX(2,     HOUGHX(3,IT,ISEG)-NTAIL)
            IR2=MIN(NRHO-1,HOUGHX(4,IT,ISEG)+NTAIL)
            IXR=(IR1+IR2)/2
*           old candidate again ?
            IF (IT.EQ.ITO) IXR=IRO
*
            NR=MAX(IXR-IR1,IR2-IXR)
            IRS=IXR-NB
            IRE=2*IXR+1
*
*           side bins <= 1/2 of central bin !
*
            MAXSDH=MIN(MAXSD2,MT/2)
*
            DO 600 JR=IXR,IRS,-1
*
               IR=JR
*
               DO 550 KR=1,2
*
                  IF (IR.LE.1.OR.IR.GE.NRHO) GOTO 500
*
*
                  IXISTR=IXIST+IR
                  IF (H1N(IXISTR).NE.MT) GOTO 500
                  LM=IAND(HOUGHL(IR,IT),MSK)
*
*                 Check isolation, side bins
*
                  NSD=0
*
                  DO 300 IDIR=-1,1,2
*
                     JXISTR=IXISTR+IXSTP*IDIR
                     IF (JXISTR.LT.IXISTL.OR.JXISTR.GT.IXISTH) GOTO 300
                     MSD=H1N(JXISTR)
*                    Something in 1. side bin ?
                     IF (MSD.LE.0) GOTO 300
*                    too much ?
                     IF (MSD.GT.MAXSDH) GOTO 500
*                    too many new layer ?
                     IF (MSD.GT.MAXSD1) THEN
                        LMSD=IAND(HOUGHL(IR+IDIR,IT+IDIR),MSK)
                        NL=0
                        DO 250 IL=1,22
                           IF (BTEST(LMSD,IL).AND.(.NOT.BTEST(LM,IL)))
     &                        NL=NL+MUNIT
  250                   CONTINUE
                        IF (NL.GT.MAXSD1) GOTO 500
                     ENDIF
*                    next side bin empty?
                     IF ((IR.LE.2).OR.(IR.GE.NRHO-1)) GOTO 500
                     JXISTR=IXISTR+2*IXSTP*IDIR
                     IF (JXISTR.GE.IXISTL.AND.JXISTR.LE.IXISTH) THEN
                        IF (H1N(JXISTR).GT.0) GOTO 500
                     ENDIF
*
                     NSD=NSD+MSD
*
  300             CONTINUE
*
                  NTOT=MT+NSD
*
*                 isolated maximum found,check it
*
*                 worse isolation?
                  FRAC=FLOAT(MT)/FLOAT(NTOT)
CHK the magic print statement		  
C                  PRINT *, ' IXCLU1- '
CHK		  
                  IF (FRAC.LT.FRACX) GOTO 500
*
C                 IF (NSD.GE.MUNIT*2) THEN
C                    JRHO(1)=IR
C                    JRHO(2)=(IR-1)*IRFAC
C                    JRHO(3)=(IR+2)*IRFAC-1
C                    CALL IXFCLU(ISEG,IT,JRHO,NISO)
C                 ENDIF
*
                  JRHO(1)=IR
*                 to get hit fragments
                  JRHO(2)=IR*IRFAC-3
                  JRHO(3)=(IR+1)*IRFAC+2
*                 put hits into IHLIST
                  CALL IXGETH(ISEG,IT,JRHO)
                  MN1=IHLIST(0,NHLIST)*MUNIT
CCC               PRINT *, ' IXCLU1> ', IWST,MT,NSD, IT, IR, MN, LHSAME
                  IF (LHSAME) THEN
                     GOTO 500
                  ENDIF
*
                  MN=MT
*                 check wire association first
                  IF (IWST.EQ.1) THEN
                     CALL IXCHKW(0,IRET)
                  ELSE
                     CALL IXCHKS(0,IRET)
                  ENDIF
*                 give up ? (w: not enough layers left, s: no matches)
                  IF (IRET.EQ.-17) THEN
                     NIN=-2
                     RETURN
                  ENDIF
*
                  IF (IRET.LE.0) GOTO 500
                  MN=IRET*MUNIT
*                 check again isolation
                  FRAC=FLOAT(MN)/FLOAT(NTOT)
CCC               IF (IDB.GE.5) THEN
C                    WRITE(6,9973) IT,IR,MT,MN,FRAC,LM,IHPAR(1,NHLIST)
C9973                FORMAT(' IXCLU1* ',4I4,F5.2,2(2X,Z8))
CCC               ENDIF
*
                  IF (FRAC.LT.FRACX) GOTO 500
*                 less or equal #layers but same isolation
                  IF (MN.LE.NIN.AND.FRAC.EQ.FRACX) GOTO 500
*
*                 fill history of candidates
*
                  NCAND=NCAND+1
*
                  IF (NCAND.GT.1.AND.NTHOLD.LT.MAXOLD) THEN
                     NTHOLD=NTHOLD+1
                     ITHOLD(NTHOLD)=ITHETA
                     IRHOLD(NTHOLD)=IRHO(1)
                     NINOLD(NTHOLD)=MTOLD
                  ENDIF
*
*                 this is the new best candidate
*
                  ITHETA=IT
                  IRHO(1)=JRHO(1)
                  IRHO(2)=JRHO(2)
                  IRHO(3)=JRHO(3)
                  NIN=MN
                  MTOLD=MT
                  FRACX=FRAC
                  LYRMSK=IHPAR(1,NHLIST)
*
                  IF (IDB.GE.4) THEN
                     WRITE(6,9977) IT,IR,MT,MN,FRAC,LM,IHPAR(1,NHLIST)
 9977                FORMAT(' IXCLU1. ',4I4,F5.2,2(2X,Z8))
                  ENDIF
*                 toggle NHLIST to keep this as current best
                  NHLIST=3-NHLIST
*
*                 continue to look for a higher or better isolated peak
*
                  IF (NIN.EQ.NTOT) THEN
                     MININS=NIN+1
*                    all hits in this maximum ?
CCC                  IF (MT.EQ.MALL) PRINT *, ' IXCLU1> MAX ', NEVENT
                     IF (MT.EQ.MALL) GOTO 9999
                     GOTO 900
                  ENDIF
*
  500             CONTINUE
                  IR=IRE-IR
*
  550          CONTINUE
*
  600       CONTINUE
*
  900    CONTINUE
         IT=IEB-IT
*
  950  CONTINUE
*
 1000 CONTINUE
*
 9999 CONTINUE
*
      RETURN
      END
 


+-------------------------------------------------------------------+
|    Claus Kleinwort                                                |
|    H1 Collaboration                                               |
|    DESY / FH1                                                     |
|    Office 1b-331                  phone :   0049 +40 8998 3545    |
|    Notkestrasse 85                fax   :   0049 +40 8998 4385    |
|    22603 Hamburg                  email : Claus.Kleinwort@desy.de |
+-------------------------------------------------------------------+




More information about the Gcc-bugs mailing list