Path: utzoo!telly!ddsw1!mcdchg!rutgers!tut.cis.ohio-state.edu!moose.cita.toronto.edu!trq
From: trq@moose.cita.toronto.edu (Tom Quinn)
Newsgroups: gnu.gcc.bug
Subject: bug in sparc gcc 1.28
Message-ID: <8809231454.AA25746@moose.cita.toronto.edu>
Date: 23 Sep 88 14:54:19 GMT
Sender: daemon@tut.cis.ohio-state.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 77

The following code will compile incorrectly with the "-O" and
"-fforce-addr" flags.  This is on a Sun4/110 running SunOs 4.0.
The resulting object will generate a Bus Error at line 27 because it
is doing a "std" (store double) with an address that is not aligned on
an 8 byte boundary.  It looks like the "-fforce-addr" flag is a bad
idea on sparc, since it causes an extra register to be used, and it
wastes a cycle on an add, which would have no cost if done as register
+ offset in the store instruction.

The compile:
gcc -S -g -v -O -fforce-addr  -sun4 -c  axis.c
gcc version 1.28
 /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dsparc -Dsun -Dunix -D__OPTIMIZE__ axis.c /tmp/cca16875.cpp
GNU CPP version 1.28
 /usr/local/lib/gcc-cc1 /tmp/cca16875.cpp -quiet -dumpbase axis.c -fforce-addr -g -O -version -o axis.s
GNU C version 1.28 (sparc) compiled by GNU C version 1.28.

The relavent assembler:
...
.stabn 68,0,27,LM12
LM12:
	sub %sp,32,%sp
	add %sp,92,%o0		<<< Bad idea, sp is 8-byte aligned, o0
				    is therefore NOT aligned
	ld [%fp-20],%f8
	fstod %f8,%f6
	std %f6,[%fp-8]
	ldd [%fp-8],%l6
	fstod %f2,%f6
	std %f6,[%fp-8]
	ldd [%fp-8],%l4
	set _xsmall,%l2
	ld [%l2],%f2
	set _xbig,%l3
	ld [%l3],%f4
	fstod %f4,%f4
	std %f4,[%o0]		<<< Horrible death occurs here.
...

The code:
------------------------------------------------------------------------
extern float 
  	     fx1,fx2;      
extern int   gx1,gx2,gy1,gy2;      
extern double pow();
void angle(),
     ltype();
static float xsmall = 0.,
	     xbig   = 0.;
box(labelxl, labelxu)
int labelxl, labelxu;
{
   float a1,a2;
    ltype(0);
    angle(0.);
    if(xsmall < 0) {                        
       if(fabs(fx1) > 37 || fabs(fx2) > 37) {
	  msg("|x-limits| are too large for logarithmic axes\n");
	  a1 = fx1; a2 =fx2;
	  xsmall = 0;
       } else {
	  a1 = pow(10.,fx1);
	  a2 = pow(10.,fx2);
       }
    } else {				 
       a1 = fx1; a2 =fx2;
    }
    (void)axis(a1,a2,xsmall,xbig,gx1,gy1,gx2-gx1,labelxl,0); /* bombs here */
    (void)axis(a1,a2,xsmall,xbig,gx1,gy2,gx2-gx1,labelxu,1);
}
---------------------
Tom Quinn                 Canadian Institute for Theoretical Astrophysics
trq@moose.cita.toronto.edu
SOON TO BE trq@moose.cita.utoronto.ca
UUCP   - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA   - trq%moose.cita.toronto.edu@relay.cs.net