[backport from gcc-4.7/trunk ] gcc/ 2012-01-09 Richard Guenther PR tree-optimization/51775 * tree-ssa-sccvn.c (visit_use): Value-number throwing stmts. * tree-ssa-pre.c (eliminate): Properly fixup EH info. --- gcc-4.6.2/gcc/tree-ssa-pre.c.~1~ 2011-07-16 13:33:28.000000000 +0200 +++ gcc-4.6.2/gcc/tree-ssa-pre.c 2012-01-18 14:23:22.000000000 +0100 @@ -4213,6 +4213,7 @@ eliminate (void) tree sprime = NULL; pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs); pre_expr sprimeexpr; + gimple orig_stmt = stmt; if (gimple_assign_single_p (stmt)) rhs = gimple_assign_rhs1 (stmt); @@ -4253,6 +4254,16 @@ eliminate (void) propagate_tree_value_into_stmt (&gsi, sprime); stmt = gsi_stmt (gsi); update_stmt (stmt); + + /* If we removed EH side-effects from the statement, clean + its EH information. */ + if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt)) + { + bitmap_set_bit (need_eh_cleanup, + gimple_bb (stmt)->index); + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, " Removed EH side-effects.\n"); + } continue; } @@ -4308,7 +4319,7 @@ eliminate (void) /* If we removed EH side-effects from the statement, clean its EH information. */ - if (maybe_clean_or_replace_eh_stmt (stmt, stmt)) + if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt)) { bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index); --- gcc-4.6.2/gcc/tree-ssa-sccvn.c.~1~ 2011-05-12 16:08:00.000000000 +0200 +++ gcc-4.6.2/gcc/tree-ssa-sccvn.c 2012-01-18 14:23:22.000000000 +0100 @@ -2802,8 +2802,7 @@ visit_use (tree use) if (gimple_code (stmt) == GIMPLE_PHI) changed = visit_phi (stmt); else if (!gimple_has_lhs (stmt) - || gimple_has_volatile_ops (stmt) - || stmt_could_throw_p (stmt)) + || gimple_has_volatile_ops (stmt)) changed = defs_to_varying (stmt); else if (is_gimple_assign (stmt)) {