Fortran Optimizer Bug
Ian Graham
igraham at NAZGUL.PHYSICS.MCGILL.CA
Sun Jun 16 08:28:57 AEST 1991
Hello Netland!
I have discovered a vexing FORTRAN optimization bug irritating, I know
it's a bug, because it works fine when compiled with -u -g, but not when
compiled with -u -O2 -- it gives wildly wrong answers. I am not clever
enough to wade through the assembler to find the fault -- any takers?
I have not yet reported this to the hotline. I will do so on monday.
I have enclosed the guilty subroutine: The optimization error apparently
occurs between the comment lines marked AAAAA and BBBBB -- it is
olat(kk) that is eventually incorrectly set. The program works fine
if the block of code defining `mask' is commented out and replaced by
either of the above definitions (ONE SITE or PURE MODEL -- see comment
lines in the code segment).
Any help or advice would be appreciated -- this subroutine is the
main engine of a large numerical simulation code, and it really needs
to be optimized -- the programs will have to run for 50 hours or
more on a 4D-35 at best: I would hate to have to triple that time by
not optimizing.
I compiled this on a Personal Iris 4D-25, Irix 3.3.2 with the
4D1-3.3 Fortran. I have no other machine or Irix versions
which I can try.
---- CUT --- HERE ---- CUT ---- HERE---- CUT --- HERE ---- CUT ---- HERE
---- CUT --- HERE ---- CUT ---- HERE---- CUT --- HERE ---- CUT ---- HERE
subroutine engine(mcstart,mcstop,boltz,olat)
integer l, nsite, lsub, lv, lvm
integer lsquare, one
parameter(l=8, nsite=512, lsub=8, lv=2, lvm=1)
parameter(lsquare=64)
parameter(one=-1)
real boltz(*)
integer olat(*)
integer spini
integer mask
integer ns1, ns2, ns3, ns4, ns5, ns6
integer nns1, nns2, nns3, nns4, nns5, nns6
integer mcstart, mcstop, mct
integer iii, kk
integer tempa, tempb, tempc, tempd, tempe, ntemp
integer row, col, uprow, dnrow, lecol, rtcol
integer slice, inslice,outslice
integer db1(nsite), or34, or56, or3456
real randi
do 101 mct=mcstart,mcstop
call simdemon(boltz,db1)
do 120 iii=1,nsite
kk=1 + nsite*randi()
spini = olat(kk)
slice = (kk-1)/LSQUARE
row = mod((kk-1),LSQUARE)/L
col = kk-(LSQUARE*slice)-(L*row)-1
uprow = mod( (row+1), L) * L
dnrow = mod( (row-1+L), L) * L
rtcol = mod( (col+1), L)
lecol = mod( (col-1+L), L)
inslice = mod( (slice+1), L) * LSQUARE
outslice = mod( (slice-1+L),L) * LSQUARE
row = row * L
slice = slice * LSQUARE
ns1 = olat(1 + col + uprow + slice)
ns2 = olat(1 + col + dnrow + slice)
ns3 = olat(1 + lecol + row + slice)
ns4 = olat(1 + rtcol + row + slice)
ns5 = olat(1 + col + row + inslice)
ns6 = olat(1 + col + row + outslice)
nns1 = not(ns1)
nns2 = not(ns2)
nns3 = not(ns3)
nns4 = not(ns4)
nns5 = not(ns5)
nns6 = not(ns6)
c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
c THE BUG COMES IN BELOW HERE.......
C PURE MODEL
c mask = -1
c ONE-SITE
c mask= or(nns1,or(nns2,or(nns3,
c : or(nns4,or(nns5,nns6)))))
C The program optimizes incorrectly with the following definition of
c mask. It works fine, however, with either of the above two
c definitions (ONE-SITE or PURE MODEL)
c TWO-SITE
or34 = or( nns3, nns4)
or56 = or( nns5, nns6)
or3456 = or( or34, or56)
tempe = and(nns5, nns6)
tempd = and(nns4, or56)
tempc = and(nns3, or(nns4, or56))
tempb = and(nns2, or3456)
tempa = and(nns1, or(nns2, or3456))
mask = or(tempa,
: or(tempb,
: or(tempc,
: or(tempd,tempe)
: )
: )
: )
tempd = or(
: not( spini),
: xor( spini, db1(iii) )
: )
ntemp = or(
: and( spini, not(mask) ),
: and( tempd, mask )
: )
olat(kk) = ntemp
c THE BUG COMES IN ABOVE HERE....... olat(kk) is incorrectly set...
c BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
c BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
120 continue
101 continue
return
end
subroutine simdemon(boltz, db1)
include 'params3d.h'
real boltz(*), rtab(nsite)
integer db1(*)
integer ii, k
do 5 ii=1, nsite
5 db1(ii) = 0
do 1 k=0,31
call ranvec(rtab,nsite)
do 11 ii=1, nsite
if( rtab(ii) .le. boltz(1) ) db1(ii) = ibset(db1(ii),k)
11 continue
1 continue
return
end
---- CUT --- HERE ---- CUT ---- HERE---- CUT --- HERE ---- CUT ---- HERE
---- CUT --- HERE ---- CUT ---- HERE---- CUT --- HERE ---- CUT ---- HERE
Thanks in advance for any help any of you can offer.
Ian.
___________________________________________ Ian Graham ______________
igraham at physics.mcgill.ca
Tel: (514) 398-6526
Fax: (514) 398-8434
More information about the Comp.sys.sgi
mailing list