summaryrefslogtreecommitdiff
path: root/gcc/ipa-pure-const.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-04-13 22:43:10 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-04-13 22:43:10 +0200
commitd93c452f1885b63e70e5b8a8dc288132357260f0 (patch)
tree766a98f3d5559b55ab94758efb47e41e397866bd /gcc/ipa-pure-const.c
parent5f36c869a5a3e9ca366cdc1c9fa7612795e32d16 (diff)
re PR c++/70641 (ICE on valid code at -O1 and above on x86_64-linux-gnu: verify_gimple failed)
PR c++/70641 * ipa-pure-const.c (pass_nothrow::execute): Call maybe_clean_eh_stmt on all recursive call stmts. Return TODO_cleanup_cfg if any dead eh edges have been purged. * g++.dg/opt/pr70641.C: New test. From-SVN: r234962
Diffstat (limited to 'gcc/ipa-pure-const.c')
-rw-r--r--gcc/ipa-pure-const.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index 892bf46d53c..3b3a419a3e3 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -1956,10 +1956,25 @@ pass_nothrow::execute (function *)
}
node->set_nothrow_flag (true);
+
+ bool cfg_changed = false;
+ if (self_recursive_p (node))
+ FOR_EACH_BB_FN (this_block, cfun)
+ if (gimple *g = last_stmt (this_block))
+ if (is_gimple_call (g))
+ {
+ tree callee_t = gimple_call_fndecl (g);
+ if (callee_t
+ && recursive_call_p (current_function_decl, callee_t)
+ && maybe_clean_eh_stmt (g)
+ && gimple_purge_dead_eh_edges (this_block))
+ cfg_changed = true;
+ }
+
if (dump_file)
fprintf (dump_file, "Function found to be nothrow: %s\n",
current_function_name ());
- return 0;
+ return cfg_changed ? TODO_cleanup_cfg : 0;
}
} // anon namespace