[gnu.gcc.bug] Suboptimal optimizations

apratt@AMES.ARC.NASA.GOV (Allan Pratt) (06/28/89)

GCC 1.35 for 68000 with -O uses "cmpw #0,a2" to test an address register
for zeroness, which is 10 clocks, while "movel a2,d0" is only four.  The
destination register is a throwaway; the condition code is what counts. 
However, if you've got them to burn, why not?

In addition, clrl is sometimes used to clear a data register, when
"moveql #0" is quicker on a 68000 and a tie on 68020.  I already
mentioned this, and you (RMS) said clrl is more general (can have memory
as an ea), which is true, but not a good answer for an optimizer.  I
guess I'll have to learn 'md' codes to figure out where to add a line to
the 68000 md for this one if you don't want to. 

Here is sample source & assembly output for the cmpw vs movel
optimization:

****************************************
main()
{
    long *y;

    while (y) {
	do_something(*y);
    }
}
****************************************
#NO_APP
gcc_compiled.:
.text
	.even
.globl _main
_main:
	link	a6,#0
	movel	a2,sp@-
	cmpw	#0,a2		| the offending line; movel a2,d0 works
	jeq	L5
L4:
	movel	a2@,sp@-
	jbsr	_do_something
	addqw	#4,sp
	cmpw	#0,a2		| the offending line; movel a2,d0 works
	jne	L4
L5:
	movel	a6@(-4),a2
	unlk	a6
	rts
****************************************