diff mbox

Remove / move copy-prop passes

Message ID alpine.LSU.2.11.1406161010050.29270@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener June 16, 2014, 8:11 a.m. UTC
On Fri, 13 Jun 2014, Richard Biener wrote:

> 
> The following leverages the "extra" work done by FRE/PRE now
> (propagating copies and constants) and removes the copy-prop
> pass run during early optimizations (no passes after it expose
> copy propagation opportunities).  It also moves the 3rd
> copy-prop pass from right after FRE (where it is now pointless)
> to right before ifcombine and phiopt as both benefit from
> copy-propagated IL (as we saw from the last phiopt bug).
> 
> I tested the copyprop removal from early opts with an
> assertion that we don't compute useful lattice values
> in the first pass instance (only for dead stmts).  For this
> the slight adjustment to the PRE/FRE elimination is necessary
> to also catch copy propagation opportunities from ASM outputs.
> 
> Bootstrap / regtest pending on x86_64-unknown-linux-gnu.

Ok, so this exposes some missing poor-mans DCE in the testsuite so
I went ahead and applied the following adjusted PRE adjustments only
sofar (I have a patch addressing the rest but will delay the actual
pass pipeline adjustments until later).

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

Richard.

2014-06-16  Richard Biener  <rguenther@suse.de>

	* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
	Make all defs available at the end.
	(eliminate): If we remove a PHI node schedule cfg-cleanup.
diff mbox

Patch

Index: gcc/tree-ssa-pre.c
===================================================================
--- gcc/tree-ssa-pre.c	(revision 211694)
+++ gcc/tree-ssa-pre.c	(working copy)
@@ -4188,7 +4188,6 @@  eliminate_dom_walker::before_dom_childre
 				   b->loop_father->num);
 			}
 		      /* Don't keep sprime available.  */
-		      eliminate_push_avail (lhs);
 		      sprime = NULL_TREE;
 		    }
 		}
@@ -4433,10 +4432,11 @@  eliminate_dom_walker::before_dom_childre
 	    VN_INFO (vdef)->valnum = vuse;
 	}
 
-      /* Make the new value available - for fully redundant LHS we
-         continue with the next stmt above.  */
-      if (lhs && TREE_CODE (lhs) == SSA_NAME)
-	eliminate_push_avail (lhs);
+      /* Make new values available - for fully redundant LHS we
+         continue with the next stmt above and skip this.  */
+      def_operand_p defp;
+      FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
+	eliminate_push_avail (DEF_FROM_PTR (defp));
     }
 
   /* Replace destination PHI arguments.  */
@@ -4521,7 +4521,11 @@  eliminate (bool do_pre)
 
       gsi = gsi_for_stmt (stmt);
       if (gimple_code (stmt) == GIMPLE_PHI)
-	remove_phi_node (&gsi, true);
+	{
+	  remove_phi_node (&gsi, true);
+	  /* Removing a PHI node in a block may expose a forwarder block.  */
+	  el_todo |= TODO_cleanup_cfg;
+	}
       else
 	{
 	  basic_block bb = gimple_bb (stmt);