[comp.lang.fortran] f77 -O breaks certain expressions

arnold@emory.uucp (Arnold D. Robbins {EUCC}) (08/11/87)

Subject: f77 -O breaks certain expressions
Index:	/usr/src/lib/{c2, pcc}/??? 4.3BSD

Description:
	Quoted directly from the original user:

	It seems that the optimizer is doing some funny things with
	expressions such as A(MOD(I - 1 + L, L), J) or A(MOD(I + 1, L), J)
	which are passed directly to a subroutine (such as the WRITE statements
	below), as opposed to indirectly through assignment.  These expressions
	refer to (lower and upper) neighbors of the site A(I, J) on a lattice
	with periodic boundary conditions.  If A(15, 0) is set to some value,
	then the lower neighbor of A(0, J) and the upper neighbor of A(14, J)
	as calculated above result in that value independent of the value of J
	(as long as J is a variable rather than a constant).  In each of the
	WRITE statements below, the value 0 is printed out for each expression
	except the last, which should also be 0.
Repeat-By:

	PROGRAM TEST

	INTEGER L, N
	PARAMETER (L = 16, N = L - 1)
	INTEGER A(0:N, 0:N)

	INTEGER I, J, B

	DO 310 I = 0, N
	    DO 310 J = 0, N
		A(I, J) = 0
  310	CONTINUE

	A(15, 0) = 1
	I = 15
	J = 1
C	Position (15, J) prints correctly:
	B = A(MOD(I + 0, L), J)
	WRITE (6, *) B, A(MOD(I + 0, L), J)
	WRITE (6, *) ''

	I = 0
	J = 1
C	Position (15, J) blows it:
	B = A(MOD(I + N, L), J)
	WRITE (6, *) B, A(MOD(0 + N, L), J), A(MOD(I + N, L), 1),
&	    A(MOD(I + N, L), J)
C	Position (1, J) prints correctly:
	B = A(MOD(I + 1, L), J)
	WRITE (6, *) B, A(MOD(I + 1, L), J)
	WRITE (6, *) ''

	I = 14
	J = 1
C	Position (13, J) prints correctly:
	B = A(MOD(I + N, L), J)
	WRITE (6, *) B, A(MOD(I + N, L), J)
C	Position (15, J) blows it:
	B = A(MOD(I + 1, L), J)
	WRITE (6, *) B, A(MOD(14 + 1, L), J), A(MOD(I + 1, L), 1),
&	    A(I + 1, J), A(MOD(I + 1, L), J)
	WRITE (6, *) ''

	STOP
	END

Remarks:
	I don't know how to fix this, or even where to start looking.
	I understand that f77 has its own optimizer, as well as using
	/lib/c2, but don't know which of the two is at fault. I have sent
	this in to UCB, but am posting here to alert the user community
	that there is a problem.
-- 
Arnold Robbins
ARPA, CSNET:	arnold@emory.ARPA	BITNET: arnold@emory
UUCP:	{ decvax, gatech, sun!sunatl }!emory!arnold
ONE-OF-THESE-DAYS:	arnold@emory.mathcs.emory.edu