Fix for IA-64 union/long double ICE.
authorJames E Wilson <wilson@specifixinc.com>
Fri, 9 Jul 2004 23:10:26 +0000 (23:10 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Fri, 9 Jul 2004 23:10:26 +0000 (16:10 -0700)
PR target/16364
* config/ia64/ia64.c (ia64_function_arg): For a single element HFA,
do return a parallel if hfa_mode == XFmode and mode == TImode.
* gcc.c-torture/compile/20040709-1.c: New.

From-SVN: r84416

gcc/ChangeLog
gcc/config/ia64/ia64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20040709-1.c [new file with mode: 0644]

index 0bb7353eeab08efaa8004af6c23e03e1c9fcf197..3c59958f24d36e163eadf9acbd99f7728089f44f 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-09  James E Wilson  <wilson@specifixinc.com>
+
+       PR target/16364
+       * config/ia64/ia64.c (ia64_function_arg): For a single element HFA,
+       do return a parallel if hfa_mode == XFmode and mode == TImode.
+
 2004-07-09 Jan Beulich <jbeulich@novell.com>
 
        * builtin-types.def (BT_UINT): Rename from BT_UNSIGNED.
index 117f965e29e2f9d485a3120380779d6fced5d8bc..fdebfba19cd3f1e11ec172212af359cdc20b6094 100644 (file)
@@ -3746,8 +3746,12 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
        }
 
       /* If we ended up using just one location, just return that one loc, but
-        change the mode back to the argument mode.  */
-      if (i == 1)
+        change the mode back to the argument mode.  However, we can't do this
+        when hfa_mode is XFmode and mode is TImode.  In that case, we would
+        return a TImode reference to an FP reg, but FP regs can't hold TImode.
+        We need the PARALLEL to make this work.  This can happen for a union
+        containing a single __float80 member.  */
+      if (i == 1 && ! (hfa_mode == XFmode && mode == TImode))
        return gen_rtx_REG (mode, REGNO (XEXP (loc[0], 0)));
       else
        return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
index 89d0e6d3a31d5caad41ccfe26e781c886841da01..d82a14fd84456b048d1e279bdaf9e0d3e05d4f03 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-09  James E Wilson  <wilson@specifixinc.com>
+
+       PR target/16364
+       * gcc.c-torture/compile/20040709-1.c: New.
+
 2004-07-09  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
        
        PR fortran/14077
diff --git a/gcc/testsuite/gcc.c-torture/compile/20040709-1.c b/gcc/testsuite/gcc.c-torture/compile/20040709-1.c
new file mode 100644 (file)
index 0000000..c8c9cc3
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR target/16364 */
+union foo {
+  long double ld;
+} bar;
+
+double
+sub (union foo baz)
+{
+  return baz.ld / 2;
+}