[gnu.gcc.bug] shot in the sparc

mdt@YAHI.STANFORD.EDU (Michael Tiemann) (02/03/89)

   Date: Thu, 02 Feb 89 03:40:52 -0800
   From: "Douglas C. Schmidt" <sources%crimee.ics.uci.edu@paris.ics.uci.edu>


   Michael,

      This is really off the wall, and probably a waste of time, but some
   code generated with gcc 1.33 is getting a segmentation fault on the
   sparc.  I'm fairly certain it's the compiler, since cc has no problems
   with it, and the system I'm compiling is very portable and has been
   around for a long time (it's a C version of Knuth's Tex program
   generated with a Web-to-C converter).

      The debugger claims the program fails on the following line:

   curval = curval * radix + d ; 

   where the variables are:

   long curval;
   char radix;
   char d;

      Here's the relevant output from gcc

      sethi %hi(_radix),%g1
      ldsb [%g1+%lo(_radix)],%o0
      sethi %hi(_curval),%g1
      ld [%g1+%lo(_curval)],%o3
      call .mul,2
      mov %o3,%o1
      mov %o0,%o2
      sll %l1,0x18,%o0
      sra %o0,0x18,%o0
      add %o2,%o0,%o0
      st %o0,[%g1+%lo(_curval)]

      And here's the output from cc (which doesn't seg fault)

     sethi %hi(_radix),%o1
     ldsb  [%o1+%lo(_radix)],%o1
     sethi %hi(_curval),%o0
     ld [%o0+%lo(_curval)],%o0
     call  .mul,2 
     nop 
     mov   %i4,%l1 
     add   %o0,%l1,%l2
     sethi %hi(_curval),%l3
     st %l2,[%l3+%lo(_curval)]

   If this is too much of a pain, just ignore it.  I don't know sparc
   well enough to figure out what's going wrong, so if you can figure it
   out from this skimpy sample that's fine, otherwise, we'll just have to
   wait....

   Doug

   p.s.  No options were used for the compilation, in particular -meager
	 was *not* applied.

This problem is very easily fixed:

Change the function `output_mul_insn' to include somewhere, a call to
CC_STATUS_INIT:

char *
output_mul_insn (operands, unsignedp)
     rtx *operands;
     int unsignedp;
{
  int lucky1 = ((unsigned)REGNO (operands[1]) - 8) <= 1;
  int lucky2 = ((unsigned)REGNO (operands[2]) - 8) <= 1;

  CC_STATUS_INIT;	/* this forgotten in virgin 1.33.  */
  if (lucky1)
    if (lucky2)
      output_asm_insn ("call .mul,2\n\tnop", operands);

Michael