bug in cc optimizer

Chris Torek chris at umcp-cs.UUCP
Sun Sep 30 01:51:34 AEST 1984


(Does this REALLY need to go to net.lang.c?  Oh well...)  Guy Harris
posted a fix for this one long ago.  It seems that Berkeley never
picked up the fix since the bug is still there in the 4.2BSD /lib/c2.
Here's RCS diffs.  (Thanks, Guy.)

[This first one is just to make it use the 4.2 stdio buffering, which
means /tmp will (hopefully) have less disk activity]

RCS file: RCS/c20.c,v
retrieving revision 1.1
diff -b -c1 -r1.1 c20.c
*** /tmp/,RCSt1001443	Sat Sep 29 11:49:05 1984
--- c20.c	Mon Aug  6 15:57:42 1984
***************
*** 57,59
  			}
! 			setbuf(stdin,_sibuf); ++infound;
  		} else if (freopen(*argv, "w", stdout) ==NULL) {

--- 57,60 -----
  			}
! /*			setbuf(stdin,_sibuf); */
! 			++infound;
  		} else if (freopen(*argv, "w", stdout) ==NULL) {
***************
*** 62,64
  		}
! 		setbuf(stdout,_sobuf);
  		argc--; argv++;

--- 63,65 -----
  		}
! /*		setbuf(stdout,_sobuf); */
  		argc--; argv++;

[and here's the real fixes]

RCS file: RCS/c21.c,v
retrieving revision 1.1
diff -b -c1 -r1.1 c21.c
*** /tmp/,RCSt1001448	Sat Sep 29 11:49:19 1984
--- c21.c	Mon Aug  6 13:43:32 1984
***************
*** 277,279
  		**	extv	$n*8,$8,A,B	>	cvtbl	n+A,B
! 		**	extv	$n*16,$16,A,B	>	cvtwl	n+A,B
  		**	extzv	$n*8,$8,A,B	>	movzbl	n+A,B

--- 277,279 -----
  		**	extv	$n*8,$8,A,B	>	cvtbl	n+A,B
! 		**	extv	$n*16,$16,A,B	>	cvtwl	2n+A,B
  		**	extzv	$n*8,$8,A,B	>	movzbl	n+A,B
***************
*** 279,281
  		**	extzv	$n*8,$8,A,B	>	movzbl	n+A,B
! 		**	extzv	$n*16,$16,A,B	>	movzwl	n+A,B
  		*/

--- 279,281 -----
  		**	extzv	$n*8,$8,A,B	>	movzbl	n+A,B
! 		**	extzv	$n*16,$16,A,B	>	movzwl	2n+A,B
  		*/
***************
*** 324,326
  			else
! 				sprintf(regs[RT1], "%d%s%s", coff, regs[RT3][0]=='(' ? "":"+",
  					regs[RT3]);

--- 324,328 -----
  			else
! 				sprintf(regs[RT1], "%d%s%s",
! 					(flen == 8 ? coff : 2*coff),
! 					(regs[RT3][0] == '(' ? "" : "+"),
  					regs[RT3]);
***************
*** 790,791
  	register char *cp1,*cp2; int r;
  	char src[C2_ASIZE];

--- 792,794 -----
  	register char *cp1,*cp2; int r;
+ 	int lhssiz, subop;
  	char src[C2_ASIZE];
***************
*** 806,807
  			}
  			if (p->back->op==CVT || p->back->op==MOVZ) {/* greedy, aren't we? */

--- 809,824 -----
  			}
+ 			/*
+ 			 * 'pos', 'siz' known; find out the size of the
+ 			 * left-hand operand of what the bicl will turn into.
+ 			 */
+ 			if (pos==0) {
+ 				if (siz==8)
+ 					lhssiz = BYTE;/* movzbl */
+ 				else if (siz==16)
+ 					lhssiz = WORD;/* movzwl */
+ 				else
+ 					lhssiz = BYTE;/* extzvl */
+ 			}
+ 			else
+ 				lhssiz = BYTE;/* extzvl */
  			if (p->back->op==CVT || p->back->op==MOVZ) {/* greedy, aren't we? */
***************
*** 808,810
  				splitrand(p->back); cp1=regs[RT1]; cp2=regs[RT2];
! 				if (equstr(src,cp2) && okio(cp1) && !indexa(cp1)
  				  && 0<=(r=isreg(cp2)) && r<NUSE

--- 825,840 -----
  				splitrand(p->back); cp1=regs[RT1]; cp2=regs[RT2];
! 				/*
! 				 * If indexa(cp1) || autoid(cp1), the fold may
! 				 * still be OK if the CVT/MOVZ has the same
! 				 * size operand on its left size as what we
! 				 * will turn the bicl into.
! 				 * However, if the CVT is from a float or
! 				 * double, forget it!
! 				 */
! 				subop = p->back->subop&0xF;/* type of LHS of
! 							      CVT/MOVZ */
! 				if (equstr(src,cp2) && okio(cp1)
! 				  && subop != FFLOAT && subop != DFLOAT
! 				  && subop != GFLOAT && subop != HFLOAT
! 				  && ((!indexa(cp1) && !autoid(cp1)) || lhssiz == subop)
  				  && 0<=(r=isreg(cp2)) && r<NUSE
***************
*** 810,812
  				  && 0<=(r=isreg(cp2)) && r<NUSE
! 				  && bitsize[p->back->subop&0xF]>=(pos+siz)
  				  && bitsize[p->back->subop>>4]>=(pos+siz)) {/* good CVT */

--- 840,842 -----
  				  && 0<=(r=isreg(cp2)) && r<NUSE
! 				  && bitsize[subop]>=(pos+siz)
  				  && bitsize[p->back->subop>>4]>=(pos+siz)) {/* good CVT */
***************
*** 818,821
  			splitrand(p); /* retrieve destination of BICL */
! 			if (siz==8 && pos==0) {
! 				p->combop = T(MOVZ,U(BYTE,LONG));
  				sprintf(line,"%s,%s",src,lastrand);

--- 848,851 -----
  			splitrand(p); /* retrieve destination of BICL */
! 			if ((siz==8 || siz == 16) && pos==0) {
! 				p->combop = T(MOVZ,U(lhssiz,LONG));
  				sprintf(line,"%s,%s",src,lastrand);
***************
*** 1363,1364
  	while (*p) if (*p++=='[') return(1);
  	return(0);

--- 1393,1402 -----
  	while (*p) if (*p++=='[') return(1);
+ 	return(0);
+ }
+ 
+ autoid(p) register char *p; {	/* 1-> uses autoincrement/autodecrement;
+ 				   0-> doesn't */
+ 	if (*p == '-' && *(p+1) == '(') return(1);
+ 	while (*p) p++;
+ 	if (*--p == '+' && *--p == ')') return(1);
  	return(0);
-- 
(This page accidently left blank.)

In-Real-Life: Chris Torek, Univ of MD Comp Sci (301) 454-7690
UUCP:	{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:	chris at umcp-cs		ARPA:	chris at maryland



More information about the Comp.lang.c mailing list