[net.bugs.4bsd] Revision to common subexpression bug fix in f77

donn@sdchema.UUCP (06/09/84)

Here's another fix for the common subexpression bug which causes
elements in the same COMMON block to be confused with each other.
This fix was sent to me by Ralph Campbell, who got it from a trusted
source.  The advantage of this new fix is that certain safe CSE
optimizations on COMMON variables are now permitted.

First remove the original fix that I supplied to scantree() in file
optcse.c:

------------------------------------------------------------------------
*** /tmp/,RCSt1021557	Fri Jun  8 14:28:06 1984
--- optcse.c	Fri Jun  8 11:45:29 1984
***************
*** 584,590
  				ap = (Addrp) p->exprblock.leftp;
  				idp = findid(ap);
  				killdepnodes(idp);
! 				if( ! (ap->isarray || ap->vstg == STGCOMMON) ) {
  					if(rnode->is_dead)idp->assgnval=idp->initval;
  					else idp->assgnval = rnode;
  				}

--- 603,609 -----
  				ap = (Addrp) p->exprblock.leftp;
  				idp = findid(ap);
  				killdepnodes(idp);
! 				if( ! ap->isarray ) {
  					if(rnode->is_dead)idp->assgnval=idp->initval;
  					else idp->assgnval = rnode;
  				}
------------------------------------------------------------------------

Then replace the samebase() routine in the same file with the following
revised version:

------------------------------------------------------------------------
LOCAL samebase(ep1,ep2)
expptr ep1,ep2;
{
    if ( ep1->tag == ep2->tag  )       
	switch (ep2->tag) {
	    case TTEMP :
		if (ep1->tempblock.memalloc == ep2->tempblock.memalloc)
			return (TRUE);
		break;
	    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) &&
				ISCONST(ep2->addrblock.memoffset) &&
				ep1->addrblock.memoffset->constblock.const.ci ==
				ep2->addrblock.memoffset->constblock.const.ci ) {
				    return(TRUE); 
			    }
			    break;

			default:
			    if (ep1->addrblock.memno == ep2->addrblock.memno ) {
				return(TRUE); 
			    }
		    }
		}
		break;
	    case TCONST :
		if( (ep1->constblock.vtype) ==
		    (ep2->constblock.vtype)  ) 
		{
			union Constant *ap,*bp;
			ap= &ep1->constblock.const;
			bp= &ep2->constblock.const;
			switch(ep1->constblock.vtype)

			{
			case TYSHORT:
			case TYLONG:
				if(ap->ci == bp->ci) return(TRUE);
				break;
			case TYREAL:
			case TYDREAL:
				if(ap->cd[0] == bp->cd[0]) return(TRUE);
				break;
			case TYCOMPLEX:
			case TYDCOMPLEX:
				if(ap->cd[0] == bp->cd[0] &&
				    ap->cd[1] == bp->cd[1] )
					return(TRUE);
				break;
			}
		}
		break;

	    default : 
		badtag ("samebase",ep2->tag);
	}
    return(FALSE);
}
------------------------------------------------------------------------

Enjoy,

Donn Seeley    UCSD Chemistry Dept.       ucbvax!sdcsvax!sdchema!donn
32 52' 30"N 117 14' 25"W  (619) 452-4016  sdcsvax!sdchema!donn@nosc.ARPA