diff options
author | Michael Matz <matz@suse.de> | 2010-03-19 12:37:28 +0000 |
---|---|---|
committer | Michael Matz <matz@gcc.gnu.org> | 2010-03-19 12:37:28 +0000 |
commit | 8a0b1aa4c117e064a0d9e3f92e7c3e9f56d43a8a (patch) | |
tree | 750b7bfe08e957981b58a98957f22c84fb66776e /gcc/builtins.c | |
parent | afcd05a759ab3133422fa471021ed00657971ebc (diff) | |
download | gcc-8a0b1aa4c117e064a0d9e3f92e7c3e9f56d43a8a.zip gcc-8a0b1aa4c117e064a0d9e3f92e7c3e9f56d43a8a.tar.gz gcc-8a0b1aa4c117e064a0d9e3f92e7c3e9f56d43a8a.tar.bz2 |
re PR target/43305 (ICE: in emit_unop_insn, at optabs.c:3838 with -Os -ffast-math and ilogbl())
PR 43305
* builtins.c (expand_builtin_interclass_mathfn,
expand_builtin_signbit): Use maybe_emit_unop_insn, emit libcalls
if that fails.
testsuite/
* gcc.dg/pr43305.c: New testcase.
From-SVN: r157567
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 705a255..a68e743 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2312,6 +2312,8 @@ expand_builtin_interclass_mathfn (tree exp, rtx target, rtx subtarget) if (icode != CODE_FOR_nothing) { + rtx last = get_last_insn (); + tree orig_arg = arg; /* Make a suitable register to place result in. */ if (!target || GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp))) @@ -2332,8 +2334,10 @@ expand_builtin_interclass_mathfn (tree exp, rtx target, rtx subtarget) /* Compute into TARGET. Set TARGET to wherever the result comes back. */ - emit_unop_insn (icode, target, op0, UNKNOWN); - return target; + if (maybe_emit_unop_insn (icode, target, op0, UNKNOWN)) + return target; + delete_insns_since (last); + CALL_EXPR_ARG (exp, 0) = orig_arg; } return NULL_RTX; @@ -5197,9 +5201,11 @@ expand_builtin_signbit (tree exp, rtx target) icode = signbit_optab->handlers [(int) fmode].insn_code; if (icode != CODE_FOR_nothing) { + rtx last = get_last_insn (); target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp))); - emit_unop_insn (icode, target, temp, UNKNOWN); - return target; + if (maybe_emit_unop_insn (icode, target, temp, UNKNOWN)) + return target; + delete_insns_since (last); } /* For floating point formats without a sign bit, implement signbit |