[net.unix-wizards] Optimizing r0

chris@umcp-cs.UUCP (06/15/83)

	From: bj@yale-com.UUCP

	    Suggestion:  change the optimizer to go ahead and
	    optimize if the r0 instructions are followed by anything
	    except a 'ret'.  The C compiler will only generate an
	    r0 instruction that also includes the return value
	    before a return(e), correct?

	This could cause problems in cases like
		return ( e ? a = b+1 : c = d+1 )

I just checked, and the compiler puts out (approximately)

	tstl	e
	jeql	L9998
	addl3	$1,b,r0
	movl	r0,a
	jbr	L9999
L9998:
	addl3	$1,d,r0
	movl	r0,c
L9999:
	ret

which follows my rule:  the r0 instruction comes immediately before
a return.  Maybe I should clarify "immediately".  I mean that
excluding branches, all statements before the ret must reference
r0.  If not, r0 is not the return value.  So the optimizer reads
the first addl3/movl pair; they are both r0 instructions.  The
jbr is followed (since it's an unconditional branch) to the ret,
thus r0 cannot be optimized.  The optimizer reads the second
addl3/movl pair; they are both r0 instructions.  The next thing
is a ret; no optimization.  But writing

	if (e)
		a = b + 1;
	else
		c = d + 1;
	<something other than return>;

will get optimized, since the <something> will (most likely) generate
non-r0 instructions.  At worst <something> will use r0 or be a
return, in which case you get no optimization; so it goes.

				- Chris