diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/builtins.c | 2 | ||||
-rw-r--r-- | gcc/expr.c | 17 | ||||
-rw-r--r-- | gcc/expr.h | 2 |
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cbdc1ad..e57b0a4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/builtins.c b/gcc/builtins.c index 67c96df..2b615a1 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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); } @@ -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); |