aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-08-17 15:56:30 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-08-17 15:56:30 +0200
commit458a1cd089646f1308c6c19573d095852f10d91d (patch)
tree1eeb4e157a1fda36611f079637227095e54c6a8c /gcc/tree-ssa-pre.c
parent37144e84aaacf4b5fe10692b9c7c690fb47df224 (diff)
downloadgcc-458a1cd089646f1308c6c19573d095852f10d91d.zip
gcc-458a1cd089646f1308c6c19573d095852f10d91d.tar.gz
gcc-458a1cd089646f1308c6c19573d095852f10d91d.tar.bz2
re PR middle-end/77259 (ICE in emit_move_insn since r232167)
PR middle-end/77259 * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): If turning a call into __builtin_unreachable-like noreturn call, adjust gimple_call_set_fntype. * tree-cfgcleanup.c (fixup_noreturn_call): Remove lhs also if gimple_call_fntype has void return type. * g++.dg/ipa/devirt-52.C: New test. From-SVN: r239537
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index edc3fdf..5d21c80 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -4543,6 +4543,15 @@ eliminate_dom_walker::before_dom_children (basic_block b)
lang_hooks.decl_printable_name (fn, 2));
}
gimple_call_set_fndecl (call_stmt, fn);
+ /* If changing the call to __builtin_unreachable
+ or similar noreturn function, adjust gimple_call_fntype
+ too. */
+ if (gimple_call_noreturn_p (call_stmt)
+ && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn)))
+ && TYPE_ARG_TYPES (TREE_TYPE (fn))
+ && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fn)))
+ == void_type_node))
+ gimple_call_set_fntype (call_stmt, TREE_TYPE (fn));
maybe_remove_unused_call_args (cfun, call_stmt);
gimple_set_modified (stmt, true);
}