Commit f5e5b46c by Richard Guenther Committed by Richard Biener

re PR middle-end/45569 (ICE: verify_stmts failed: statement marked for throw in…

re PR middle-end/45569 (ICE: verify_stmts failed: statement marked for throw in middle of block with -fnon-call-exceptions)

2010-09-07  Richard Guenther  <rguenther@suse.de>

	PR middle-end/45569
	* tree-eh.c (operation_could_trap_helper_p): Neither COMPLEX_EXPR
	nor CONSTRUCTOR can trap.
	* tree-complex.c (update_complex_assignment): Update EH info.

	* g++.dg/eh/pr45569.C: New testcase.

From-SVN: r163947
parent c9d6130e
2010-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/45569
* tree-eh.c (operation_could_trap_helper_p): Neither COMPLEX_EXPR
nor CONSTRUCTOR can trap.
* tree-complex.c (update_complex_assignment): Update EH info.
2010-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/45569
* tree-cfg.c (build_gimple_cfg): Remove redundant stmt verification.
* passes.c (execute_function_todo): Do not verify anything if
we saw errors.
......
2010-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/45569
* g++.dg/eh/pr45569.C: New testcase.
2010-09-07 Bernd Schmidt <bernds@codesourcery.com>
PR target/43137
......
// { dg-do compile }
// { dg-options "-O -fnon-call-exceptions" }
float f ();
_Complex float g ();
void
i (_Complex float);
float j ()
{
_Complex float x = 0;
try
{
x = f ();
}
catch ( ...)
{
x += g ();
}
i (x);
}
......@@ -662,12 +662,16 @@ static void
update_complex_assignment (gimple_stmt_iterator *gsi, tree r, tree i)
{
gimple_stmt_iterator orig_si = *gsi;
gimple stmt;
if (gimple_in_ssa_p (cfun))
update_complex_components (gsi, gsi_stmt (*gsi), r, i);
gimple_assign_set_rhs_with_ops (&orig_si, COMPLEX_EXPR, r, i);
update_stmt (gsi_stmt (orig_si));
stmt = gsi_stmt (orig_si);
update_stmt (stmt);
if (maybe_clean_eh_stmt (stmt))
gimple_purge_dead_eh_edges (gimple_bb (stmt));
}
......
......@@ -2334,6 +2334,11 @@ operation_could_trap_helper_p (enum tree_code op,
return true;
return false;
case COMPLEX_EXPR:
case CONSTRUCTOR:
/* Constructing an object cannot trap. */
return false;
default:
/* Any floating arithmetic may trap. */
if (fp_operation && flag_trapping_math)
......
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