[gnu.gcc.bug] `gcc' optimizes the enclosed program incorrectly

derek@UUNET.UU.NET (Derek Clegg) (06/24/89)

/* Version:
 *     gcc version 1.35
 * File:
 *     <this file>
 * Compile with:
 *     gcc -O -S <this file>
 * Problem:
 *     `gcc' optimizes the following program incorrectly.
 * Notes:
 *     gcc was compiled with `config.gcc sun3-os4'.
 *     I am using a Sun 3/60 with UNIX 4.2 (Sun release 4.0.1).
 *
 *		Derek B Clegg ({uunet,ucbcad,sun}!island!derek)
 */

void
matte(dst, w, color, alpha)
unsigned char *dst;
int w, color;
unsigned char *alpha;
{
    int v;

    while (--w >= 0) {
	v = *dst;
	*dst++ = v + ((color - v)*(*alpha++) >> 8);
    }

#if 0
/*
 * In the line marked with `%' below, we see that `v' (originally containing
 * `*dst') is overwritten with the value `*alpha'.  This is incorrect, since
 * `v' is subsequently used.
 */
_matte:
	link a6,#0
	moveml #0x3000,sp@-
	movel a6@(8),a0		| dst
	movel a6@(12),d2	| w
	movel a6@(16),d3	| color
	movel a6@(20),a1	| alpha
	clrl d1			| v
	jra L2
L4:
	moveb a0@,d1		| v = *dst 
	movel d3,d0		| tmp = color
	subl d1,d0		| tmp -= v
%	moveb a1@+,d1		| v = *alpha++ (!)
	mulsl d1,d0		| tmp *= v
	asrl #8,d0		| tmp >>= 8
	addb d1,d0		| tmp += v (= *alpha)
	moveb d0,a0@+		| *dst++ = tmp
L2:
	subql #1,d2		| --w
	jpl L4
	moveml a6@(-8),#0xc
	unlk a6
	rts
#endif
}