diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-pure-const.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr70641.C | 10 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 328903d1c54..26db5fefac7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-04-13 Jakub Jelinek <jakub@redhat.com> + 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. + PR c++/70594 * tree-sra.c (create_access_replacement, get_replaced_param_substitute): Set DECL_NAMELESS on repl if it 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0987349f8a9..5e047c60a9c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-13 Jakub Jelinek <jakub@redhat.com> + + PR c++/70641 + * g++.dg/opt/pr70641.C: New test. + 2016-04-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> PR rtl-optimization/68749 diff --git a/gcc/testsuite/g++.dg/opt/pr70641.C b/gcc/testsuite/g++.dg/opt/pr70641.C new file mode 100644 index 00000000000..99af74248f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr70641.C @@ -0,0 +1,10 @@ +// PR c++/70641 +// { dg-do compile } +// { dg-options "-O2" } + +void +foo () +{ + try { foo (); } + catch (...) { __builtin_abort (); } +} |