SRI-NOSC/doc/C.compiler.bug

I am having problems with the C compiler.  In some cases, it optimizes
references to register quantities incorrectly.  The code fragement in
question is from the NCP daemon code, and is given below:

hw_all(skt_p,msgs,bits)
struct socket	*skt_p;
int	msgs,bits;
{
	register char	*bp;	/* byte pointer for constructing command */

	bp = &hw_buf[0];	/* point at beginning of assembly buffer */
	*bp++ = hhi_all;	/* op code */
	*bp++ = skt_p->s_hstlnk.hl_link;	/* link number */
	*bp++ = msgs.hi_byte;	/* copy messages, swapping bytes */
	*bp++ = msgs.lo_byte;
	*bp++ = 0;		/* 1st 2 bytes of bits are zero */
	*bp++ = 0;
	*bp++ = bits.hi_byte;	/* copy bits, swapping bytes */
	*bp++ = bits.lo_byte;
	qup_pro( &hw_buf[0],8 );	/* queue for sending */
}

Which compiles into:

_hw_all:
~~hw_all:
~skt_p=4
~bp=r4
~bits=10
~msgs=6
jsr	r5,csv
mov	$_hw_buf,r4
movb	$4,(r4)+
mov	4(r5),r0
movb	7(r0),(r4)+
movb	7(r5),(r4)+
movb	6(r5),(r4)+
clrb	(r4)+
clrb	(r4)+
movb	11(r5),(r4)+
movb	10(r5),(r4)+
mov	$10,(sp)
mov	r4,-(sp)	/ OOPS!  Should be: mov	$_hw_buf,-(sp)
jsr	pc,*$_qup_pro
tst	(sp)+
jmp	cret

As you can see, there was an error in the compiler's model of the register
values.  Has anybody encountered this before?  If so, do you have a fix?
At the moment, this means that I must compile code on my machine (an 11/40)
for use on the NUSC-NPT machine (an 11/70) since I don't trust the compiler.
I would regret having to move my compiler to NUSC-NPT (I'd rather do the
reverse!) because the rest of the optimizations were very good.  (NUSC-NPT
is a latter V6 system than mine.)