[gnu.gcc.bug] gcc 1.34, bug in defer-pop with valued blocks

crowl@cs.rochester.edu (Lawrence Crowl) (03/18/89)

Gcc 1.34 incorrectly defers popping function parameters that are computed by
value returning blocks.  Compiling with the -fno-defer-pop option is a
suitable work-around.  Below is a program exhibiting the problem.

     int f( a, b )
         int a ;
         int b ;
         {
         return a * b ;
         }
          
     void main( )
         {
         int a = 2 ;
         int b = 3 ;
         int c = 5 ;
         int d ;
         int e = f( ({ d = f( a, b ) ; d+= 1 ; }), c ) ;
         printf( "a==%d  b==%d  c==%d  d==%d  e==%d\n", a, b, c, d, e ) ;
         }

In summary, the compiler generates:

     push c
     push b
     push a
     call f
     copy result to d
     increment d
     push d
     call f

However, this leaves parameters b and a to the first call to f INBETWEEN
parameters c and d to to second call to f.

The command "gcc -v -S defer.c" yields:

gcc version 1.34
 /usr/su/lib/gcc-cpp -v -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 defer.c /tmp/cca10231.cpp
GNU CPP version 1.34
 /usr/su/lib/gcc-cc1 /tmp/cca10231.cpp -quiet -dumpbase defer.c -version -o defer.s
GNU C version 1.34 (68k, MIT syntax) compiled by GNU C version 1.34.

and the assembly code:

#NO_APP
gcc_compiled.:
.text
	.even
.globl _f
_f:
	link a6,#0
	movel a6@(8),d0
	mulsl a6@(12),d0
	movel d0,d0
	jra L1
L1:
	unlk a6
	rts
LC0:
	.ascii "a==%d  b==%d  c==%d  d==%d  e==%d\12\0"
	.even
.globl _main
_main:
	link a6,#-20
	moveq #2,d1
	movel d1,a6@(-4)
	moveq #3,d1
	movel d1,a6@(-8)
	moveq #5,d1
	movel d1,a6@(-12)
	movel a6@(-12),sp@-
	movel a6@(-8),sp@-
	movel a6@(-4),sp@-
	jbsr _f
	movel d0,d0
	movel d0,d0
	movel d0,a6@(-16)
	movel d0,d0
	addql #1,d0
	movel d0,d0
	movel d0,a6@(-16)
	movel d0,sp@-
	jbsr _f
	movel d0,a6@(-20)
	movel a6@(-20),sp@-
	movel a6@(-16),sp@-
	movel a6@(-12),sp@-
	movel a6@(-8),sp@-
	movel a6@(-4),sp@-
	pea LC0
	jbsr _printf
L2:
	unlk a6
	rts

-- 
  Lawrence Crowl		716-275-9499	University of Rochester
		      crowl@cs.rochester.edu	Computer Science Department
...!{allegra,decvax,rutgers}!rochester!crowl	Rochester, New York,  14627