summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-pure-const.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr70641.C10
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 (); }
+}