[gnu.gcc.bug] GCC-1.32 optimizer error

brent@WJH12.HARVARD.EDU (Brent Byer) (01/23/89)

Produced on Sun3 (w/OS3.x), GCC-1.32
  (host=Sun3os3  target=Sun3os3)

	[ Looks like few people use reg/shorts, huh? ]
		It is a win in the scene I have.

-------------------
foo.c
-------------------
foo(ai)
int ai;
{
	extern short gfoo[];
	register short i, pp;

	if((i = ai) == 0)
		return(-1);
	pp = gfoo[i];
	return(pp);
}

-----------------------
foo.s No Optimization ( gcc -traditional -S -c foo.c )
-----------------------
#NO_APP
gcc_compiled.:
.text
	.even
.globl _foo
_foo:
	link a6,#0
	movel d2,sp@-
	movew a6@(10),d1
	tstw d1
	jne L2
	moveq #-1,d0
	jra L1
L2:
	movew d1,d0
	extl d0
	asll #1,d0
	lea _gfoo,a0
	movew a0@(d0:l),d2
	movew d2,d0
	extl d0
	jra L1
L1:
	movel a6@(-4),d2
	unlk a6
	rts

-------------------------
foo.s  With Optimization ( gcc -O -traditional -S -c foo.c )
-------------------------
#NO_APP
gcc_compiled.:
.text
	.even
.globl _foo
_foo:
	link a6,#0
	movew a6@(8),d0
	jne L2
	moveq #-1,d0
	jra L1
L2:
	lea _gfoo,a0
	movew a0@(d0:w:2),d0
	extl d0
L1:
	unlk a6
	rts

---------------------------
Note that the optimizer has used the wrong half of the parameter. a6@(8) vs.
	a6@(10)

Congratulations to rms et al @FSF.  The GCC compiler does an excellent
job.  Truly embarrasses those laid-back lazy other ones.

I especially liked how it remembered that it had the possibly useful
side-effect of getting the remainder via a division, and then
seeing an attempt to produce that same remainder, it just snags it
with a simple reach into a side-pocket.  Nice one.
  (That x/y ... x%y ...  is a *not* infrequent combination).

	regards,

	  brent byer