re PR middle-end/55114 (gcc.dg/builtins-53.c ICEs on mips64 soft-float)
gcc/ PR middle-end/55114 * expr.h (maybe_emit_group_store): Declare. * expr.c (maybe_emit_group_store): New function. * builtins.c (expand_builtin_int_roundingfn): Call it. (expand_builtin_int_roundingfn_2): Likewise. From-SVN: r195060
This commit is contained in:
parent
511dcace07
commit
9a002da86b
|
@ -1,3 +1,11 @@
|
|||
2013-01-09 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
PR middle-end/55114
|
||||
* expr.h (maybe_emit_group_store): Declare.
|
||||
* expr.c (maybe_emit_group_store): New function.
|
||||
* builtins.c (expand_builtin_int_roundingfn): Call it.
|
||||
(expand_builtin_int_roundingfn_2): Likewise.
|
||||
|
||||
2013-01-09 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
PR rtl-optimization/pr55829
|
||||
|
|
|
@ -2753,6 +2753,7 @@ expand_builtin_int_roundingfn (tree exp, rtx target)
|
|||
exp = build_call_nofold_loc (EXPR_LOCATION (exp), fallback_fndecl, 1, arg);
|
||||
|
||||
tmp = expand_normal (exp);
|
||||
tmp = maybe_emit_group_store (tmp, TREE_TYPE (exp));
|
||||
|
||||
/* Truncate the result of floating point optab to integer
|
||||
via expand_fix (). */
|
||||
|
@ -2856,6 +2857,7 @@ expand_builtin_int_roundingfn_2 (tree exp, rtx target)
|
|||
fallback_fndecl, 1, arg);
|
||||
|
||||
target = expand_call (exp, NULL_RTX, target == const0_rtx);
|
||||
target = maybe_emit_group_store (target, TREE_TYPE (exp));
|
||||
return convert_to_mode (mode, target, 0);
|
||||
}
|
||||
|
||||
|
|
17
gcc/expr.c
17
gcc/expr.c
|
@ -2079,6 +2079,23 @@ emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED, int ssize)
|
|||
emit_move_insn (orig_dst, dst);
|
||||
}
|
||||
|
||||
/* Return a form of X that does not use a PARALLEL. TYPE is the type
|
||||
of the value stored in X. */
|
||||
|
||||
rtx
|
||||
maybe_emit_group_store (rtx x, tree type)
|
||||
{
|
||||
enum machine_mode mode = TYPE_MODE (type);
|
||||
gcc_checking_assert (GET_MODE (x) == VOIDmode || GET_MODE (x) == mode);
|
||||
if (GET_CODE (x) == PARALLEL)
|
||||
{
|
||||
rtx result = gen_reg_rtx (mode);
|
||||
emit_group_store (result, x, type, int_size_in_bytes (type));
|
||||
return result;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
/* Copy a BLKmode object of TYPE out of a register SRCREG into TARGET.
|
||||
|
||||
This is used on targets that return BLKmode values in registers. */
|
||||
|
|
|
@ -334,6 +334,8 @@ extern rtx emit_group_move_into_temps (rtx);
|
|||
PARALLEL. */
|
||||
extern void emit_group_store (rtx, rtx, tree, int);
|
||||
|
||||
extern rtx maybe_emit_group_store (rtx, tree);
|
||||
|
||||
/* Copy BLKmode object from a set of registers. */
|
||||
extern void copy_blkmode_from_reg (rtx, rtx, tree);
|
||||
|
||||
|
|
Loading…
Reference in New Issue