diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-04-13 22:43:10 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-04-13 22:43:10 +0200 |
commit | d93c452f1885b63e70e5b8a8dc288132357260f0 (patch) | |
tree | 766a98f3d5559b55ab94758efb47e41e397866bd /gcc/ipa-pure-const.c | |
parent | 5f36c869a5a3e9ca366cdc1c9fa7612795e32d16 (diff) | |
download | gcc-d93c452f1885b63e70e5b8a8dc288132357260f0.zip gcc-d93c452f1885b63e70e5b8a8dc288132357260f0.tar.gz gcc-d93c452f1885b63e70e5b8a8dc288132357260f0.tar.bz2 |
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.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 892bf46..3b3a419 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 |