[net.bugs.4bsd] [4bsd-f77 #36] f77 fix for COMMON needs to be extended to EQUIVALENCE

4bsd-f77@utah-cs.UUCP (4.2 BSD f77 bug reports) (08/30/84)

From: Donn Seeley <donn@utah-cs.arpa>

Subject: The f77 fix for COMMON needs to be extended to EQUIVALENCE
Index:	usr.bin/f77/src/f77pass1/optcse.c 4.2BSD

Description:
	The fix given in 4bsd-f77 #18 (<163@sdchema.UUCP>, titled
	'Revision to common subexpression bug fix in f77') is incomplete
	-- the same problems that occur with common subexpressions and
	COMMON variables also occur with EQUIVALENCEd variables.  This
	bug was observed and fixed by Jerry Berkman at UC Berkeley.

Repeat-By:
	Compile the following program (from Jerry Berkman) with the
	optimizer on:

	----------------------------------------------------------------
	c		sees common subexp where none exists
	      double precision   a0,a1, b0,b1, z0(2),z1(2)
	      double complex     a(2), za0,za1
	      equivalence        (za0,z0(1)),(za1,z1(1)),
	     1                   (a0,z0(1)),(b0,z0(2)), (a1,z1(1)),(b1,z1(2))
		data a/ (1.0d0,2.0d0),      (12.2d0,14.8d0)/
	c
	         za0 = a(1)
	         za1 = a(2)
	         a(1) = dcmplx(a0+a1,b0+b1)
	         a(2) = dcmplx(a0-a1,b0-b1)
		print *, a(1), a(2)
	      end
	----------------------------------------------------------------

	When run, this program prints the following:

	----------------------------------------------------------------
	  (   13.200000000000,   13.200000000000)
	  (  -11.200000000000,  -11.200000000000)
	----------------------------------------------------------------

	But it's supposed to print:

	----------------------------------------------------------------
	  (   13.200000000000,   16.800000000000)
	  (  -11.200000000000,  -12.800000000000)
	----------------------------------------------------------------

Fix:
	The problem is exactly the same as the problem with COMMON
	variables and CSE, except applied to EQUIVALENCEd variables; so
	I will skip the usual tedious explanation and simply present
	the fix.  This fix applies to the routine samebase() in
	f77pass1/optcse.c and must be applied AFTER the earlier fix:

	----------------------------------------------------------------
	*** /tmp/,RCSt1024965	Sun Aug 19 23:41:08 1984
	--- optcse.c	Sat Aug  4 20:39:58 1984
	***************
	*** 404,409
		    case TADDR :  
			if (ep1->addrblock.vstg == ep2->addrblock.vstg) {
			    switch(ep1->addrblock.vstg) {
				case STGCOMMON:
				    if (ep1->addrblock.memno == ep2->addrblock.memno &&
					ISCONST(ep1->addrblock.memoffset) &&

	--- 409,415 -----
		    case TADDR :  
			if (ep1->addrblock.vstg == ep2->addrblock.vstg) {
			    switch(ep1->addrblock.vstg) {
	+ 			case STGEQUIV:
				case STGCOMMON:
				    if (ep1->addrblock.memno == ep2->addrblock.memno &&
					ISCONST(ep1->addrblock.memoffset) &&
	----------------------------------------------------------------

Donn Seeley    University of Utah CS Dept    donn@utah-cs.arpa
40 46' 6"N 111 50' 34"W    (801) 581-5668    decvax!utah-cs!donn