Fix for IA-64 union/long double ICE.

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
This commit is contained in:
James E Wilson 2004-07-09 23:10:26 +00:00 committed by Jim Wilson
parent 2319a1d1f7
commit 5806d4fd84
4 changed files with 27 additions and 2 deletions

View 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.

View 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));

View 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

View File

@ -0,0 +1,10 @@
/* PR target/16364 */
union foo {
long double ld;
} bar;
double
sub (union foo baz)
{
return baz.ld / 2;
}