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