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