diff mbox

Fix PR51775

Message ID alpine.LNX.2.00.1201091500570.4999@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Jan. 9, 2012, 2:02 p.m. UTC
This fixes PR51775, we do not need to avoid value-numbering for
stmts that can throw.  PRE already ensures to not enter anything
into the EXP/TMP_GEN sets for those so it won't ever end up
trying to insert throwing expressions.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2012-01-09  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/51775
	* tree-ssa-sccvn.c (visit_use): Value-number throwing stmts.
	* tree-ssa-pre.c (eliminate): Properly fixup EH info.
diff mbox

Patch

Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c	(revision 183007)
+++ gcc/tree-ssa-sccvn.c	(working copy)
@@ -3178,8 +3178,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))
 	{
Index: gcc/tree-ssa-pre.c
===================================================================
--- gcc/tree-ssa-pre.c	(revision 183007)
+++ gcc/tree-ssa-pre.c	(working copy)
@@ -4194,6 +4194,7 @@  eliminate (void)
 	      tree sprime = NULL;
 	      pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs);
 	      pre_expr sprimeexpr;
+	      gimple orig_stmt = stmt;
 
 	      sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
 					       get_expr_value_id (lhsexpr),
@@ -4231,6 +4232,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;
 		}
 
@@ -4286,7 +4297,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);