[gnu.gcc.bug] gcc-1.35 bug

mark@AI.MIT.EDU (Mark Mills) (06/02/89)

I have found what appears to be a bug in gcc-1.35.  However,
it is such a simple thing surely it is not.  Here are some
examples which demonstrate the "bug".  Each was compiled
with: gcc -O e1.c.  (The as listings by: gcc -O -S e1.c)

This gcc was brought up on a R3V5.1 Unix system using pcc.
I am using the native as and ld.  The processor is 68030/68882.
This same R3V5.1/pcc compiles and runs TeX, X11, etc, so I
believe that much is ok.  Gcc compiled itself fine during
stage1 build, except c-parse.tab.c, expr.c and insn-recog.c
would not compile with both -g and -O options.  Either just
-g or -O worked fine by itself.  These modules were built with
-g for the stage1 build.  The stage1 build was what was used
to generate the sequences below.

It would be nice if there was a gcc test suite that had
known programs to test against.  Know you always wonder whether
it is gcc or your "port" which is causing the problems.

Regards and keep up the good work,
Mark Mills
---
mark@motcoh.UUCP
{osu-cis, mcdchg}!motcoh!mark

===================  Example 1  =========================
main()
{

  float M;
  int N;

   N = 1000000;
   M = (float)N;
   printf ("M = %e\n",M); 
   printf ("N = %e\n",(float)N); 
  
}


M = 1.000000e+06
N = 1.000000e+06


	text
L%C0:
	byte	77,32,61,32,37,101,10,0
L%C1:
	byte	78,32,61,32,37,101,10,0
	even
	global main
main:
	link.w %a6,&0
	fmovem &0x4,-(%sp)
	mov.l %d2,-(%sp)
	fmove.l &1000000,%fp2
	fmove.d %fp2,-(%sp)
	pea L%C0
	move.l &printf,%d2
	move.l %d2,%a0
	jsr (%a0)
	fmove.d %fp2,-(%sp)
	pea L%C1
	move.l %d2,%a0
	jsr (%a0)
	mov.l -16(%a6),%d2
	fmovm.x -12(%a6),&0x20
	unlk %a6
	rts

=================  Example 2  ======================
main()
{

  float M;
  int N;

   N = 1000000;
   M = 1000000.0;
   printf ("M = %e\n",M); 
   printf ("N = %e\n",(float)N); 
  
}

M = 0.000000e+00
N = 1.000000e+06


	text
L%C0:
	byte	77,32,61,32,37,101,10,0
L%C1:
	byte	78,32,61,32,37,101,10,0
	even
	global main
main:
	link.w %a6,&0
	movm.l &0x3000,-(%sp)
	move.l &1000000,%d2
	fmove.s &0x0,%fp1
	fmove.d %fp1,-(%sp)
	pea L%C0
	move.l &printf,%d3
	move.l %d3,%a0
	jsr (%a0)
	fmove.l %d2,%fp0
	fmove.d %fp0,-(%sp)
	pea L%C1
	move.l %d3,%a0
	jsr (%a0)
	movm.l -8(%a6),&0xc
	unlk %a6
	rts

================  Example 3  ==================
main()
{

  float M;
  int N;

   N = 1000000;
   M = 1.0e+06;
   printf ("M = %e\n",M); 
   printf ("N = %e\n",(float)N); 
  
}

Produces the same printf output and identical asm code.

==================  Example 4  ======================
#define M 1000000.0
main()
{
   printf ("M = %e\n",M); 
}

M = 1.000000e+06

	text
L%C0:
	byte	77,32,61,32,37,101,10,0
	even
	global main
main:
	link.w %a6,&0
	clr.l -(%sp)
	move.l &1093567616,-(%sp)
	pea L%C0
	jsr printf
	unlk %a6
	rts

=================  Example 5  ==================

#define M 1000000.0
main()
{
long num = 50;
float oops;

   oops = num * M;
   printf ("oops = %e\n",oops); 
}

oops = 4.275000e+04


	text
L%C0:
	byte	111,111,112,115,32,61,32,37
	byte	101,10,0
	even
	global main
main:
	link.w %a6,&0
	fmove.l &50,%fp0
	fmul.d &0x408ab800000000,%fp0
	fmove.s %fp0,%d0
	fmove.s %d0,%fp1
	fmove.d %fp1,-(%sp)
	pea L%C0
	jsr printf
	unlk %a6
	rts