From: rsandifo Date: Wed, 9 Jan 2013 18:19:16 +0000 (+0000) Subject: gcc/ X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=933eb13ae74382de2a87cb091e00cd7896b49855;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195060 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cbdc1adca959..e57b0a48aa28 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-01-09 Richard Sandiford + + 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 PR rtl-optimization/pr55829 diff --git a/gcc/builtins.c b/gcc/builtins.c index 67c96df2689b..2b615a17c100 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); } diff --git a/gcc/expr.c b/gcc/expr.c index e7b77707de8f..08da907b3327 100644 --- a/gcc/expr.c +++ b/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. */ diff --git a/gcc/expr.h b/gcc/expr.h index c2168287cff0..b143d8eeb95b 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -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);