diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-01-09 18:19:16 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2013-01-09 18:19:16 +0000 |
commit | 9a002da86b6a69292b2d520a17cf1412e092ec76 (patch) | |
tree | d95935d5d4ca6f06429b4ffd9a9f54942215415d /gcc | |
parent | 511dcace074c36f4c8d7fcf835ba795fa82268c0 (diff) | |
download | gcc-9a002da86b6a69292b2d520a17cf1412e092ec76.zip gcc-9a002da86b6a69292b2d520a17cf1412e092ec76.tar.gz gcc-9a002da86b6a69292b2d520a17cf1412e092ec76.tar.bz2 |
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
Diffstat (limited to 'gcc')
-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); |