Commit d93c452f by Jakub Jelinek Committed by Jakub Jelinek

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
parent 5f36c869
2016-04-13 Jakub Jelinek <jakub@redhat.com> 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 PR c++/70594
* tree-sra.c (create_access_replacement, * tree-sra.c (create_access_replacement,
get_replaced_param_substitute): Set DECL_NAMELESS on repl if it get_replaced_param_substitute): Set DECL_NAMELESS on repl if it
......
...@@ -1956,10 +1956,25 @@ pass_nothrow::execute (function *) ...@@ -1956,10 +1956,25 @@ pass_nothrow::execute (function *)
} }
node->set_nothrow_flag (true); 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) if (dump_file)
fprintf (dump_file, "Function found to be nothrow: %s\n", fprintf (dump_file, "Function found to be nothrow: %s\n",
current_function_name ()); current_function_name ());
return 0; return cfg_changed ? TODO_cleanup_cfg : 0;
} }
} // anon namespace } // anon namespace
......
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> 2016-04-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR rtl-optimization/68749 PR rtl-optimization/68749
......
// PR c++/70641
// { dg-do compile }
// { dg-options "-O2" }
void
foo ()
{
try { foo (); }
catch (...) { __builtin_abort (); }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment