[gnu.gcc.bug] gcc-1.34

shep@ALLSPICE.LCS.MIT.EDU (Tim Shepard) (03/21/89)

gcc-1.34 on 4.3bsd vax, foo.c (below) compiled with "gcc -S -O -c foo.c"

Note the two addl3's with identical sources before L9: below.  Note
how r5 and r6 are subsequently each only used once.  It looks like
code has been moved out of the loop from two different basic blocks in
the inner loop, but it doesn't look like cse ever got a crack at it.

I do appreciate the fine balance between an optimizer looping forever
and being very thorough.  I won't complain too much if gcc is not
improved to catch this case.

			-Tim

foo.c:
----------------------cut here----------------
int nums[4][4];

int foo()
{
  int i,j;
  int h = 0;
  int t = 0;
  
  for(i=0;i<4;i++) {
    for (j=0;j<4;j++)
      if (nums[i][j] < 0) {
	h += t; t = 0;
      } else {
	t *= 10; t += nums[i][j];
      }
    h += t;
  }
  return h;
}
--------------------cut here-------------------


foo.s:
-----------------------cut here-----------------
#NO_APP
gcc_compiled.:
.text
	.align 1
.globl _foo
_foo:
	.word 0xc0
	clrl r3
	clrl r1
	clrl r4
	movab _nums,r7
L10:
	clrl r2
	ashl $4,r4,r0
	addl3 r7,r0,r6
	addl3 r7,r0,r5
L9:
	tstl (r6)[r2]
	jgeq L7
	addl2 r1,r3
	clrl r1
	jbr L6
L7:
	moval (r1)[r1],r0
	addl3 r0,r0,r1
	addl2 (r5)[r2],r1
L6:
	incl r2
	cmpl r2,$3
	jleq L9
	addl2 r1,r3
	incl r4
	cmpl r4,$3
	jleq L10
	movl r3,r0
	ret
.comm _nums,64
-------------------------cut here---------------------