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:
parent
2319a1d1f7
commit
5806d4fd84
|
@ -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.
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
/* PR target/16364 */
|
||||
union foo {
|
||||
long double ld;
|
||||
} bar;
|
||||
|
||||
double
|
||||
sub (union foo baz)
|
||||
{
|
||||
return baz.ld / 2;
|
||||
}
|
Loading…
Reference in New Issue