Subject: gcc crash

From: Kjeld Borch Egevang <[email-masked]>
Date: Thu, 27 Sep 2001 16:59:47 +0200 (CEST)

When I compile the following function with "gcc -O2" the compiler crashes.
Is this a known problem?

static float sp_f2l(float x)
{
    long l, *xl;
    float y;

    xl = (void *)&y;
    l = x;
    *xl = l;
    return y;
}

I use gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-97.2)

/Kjeld

-- 
_    _ ____  ___                       Mailto:[email-masked]
|\  /|||___)(___    MIPS Denmark       Direct: +45 44 86 55 85
| \/ |||    ____)   Lautrupvang 4 B    Switch: +45 44 86 55 55
  TECHNOLOGIES      DK-2750 Ballerup   Fax...: +45 44 86 55 56
                    Denmark            http://www.mips.com/

---

From: Keith Owens <[email-masked]>
Date: Fri, 28 Sep 2001 22:37:52 +1000

On Thu, 27 Sep 2001 16:59:47 +0200 (CEST), 
>static float sp_f2l(float x)

You are breaking the C rules for data accesses.  Compile with
-fno-strict-aliasing if you want to break the rules.  Or, and this is
much better, use a union of long and float to "convert" one
representation to another.

---

From: Ralf Baechle <[email-masked]>
Date: Fri, 28 Sep 2001 19:05:38 +0200

> representation to another.

Yes said the compiler is crashing so that's definately a gcc bug.  Aside
of course of the code itself being buggy also.

  Ralf

---

From: "H . J . Lu" <[email-masked]>
Date: Sat, 29 Sep 2001 01:35:49 -0700

> I use gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-97.2)

I back ported this from gcc in CVS to gcc 2.96. It works for me. It
will be in the next RedHat 7.1/mips update.

H.J.
-----
2001-09-29  H.J. Lu <[email-masked]>

	* gcc/emit-rtl.c (subreg_hard_regno): Comment out dubious code.

--- gcc/emit-rtl.c.subreg	Sat Sep 29 01:21:24 2001
+++ gcc/emit-rtl.c	Sat Sep 29 01:22:06 2001
@@ -734,6 +734,7 @@ subreg_hard_regno (x, check_mode)
 
   final_regno = SUBREG_REGNO (x);
 
+#if 0
   /* Punt if what we end up with is not a valid regno in
      the SUBREG's mode, or we went past the end of the inner
      REG's mode, or we overflow past the last hard regno.  */
@@ -743,6 +744,7 @@ subreg_hard_regno (x, check_mode)
 	   HARD_REGNO_NREGS (base_regno, GET_MODE (reg)))
        || final_regno >= FIRST_PSEUDO_REGISTER)
     abort ();
+#endif
 
   return final_regno;
 }