[PATCH] Copy-propagate constants

Richard Guenther rguenther@suse.de
Tue Aug 10 09:44:00 GMT 2010


This teaches copyprop to also propagate copies of constants.

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

Richard.

2010-08-10  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-copy.c (set_copy_of_val): Use operand_equal_p.
	(copy_prop_visit_assignment): Simplify.
	(copy_prop_visit_stmt): Also visit assignments from
	constants.
	(copy_prop_visit_phi_node): Use operand_equal_p.

Index: gcc/tree-ssa-copy.c
===================================================================
--- gcc/tree-ssa-copy.c	(revision 163032)
+++ gcc/tree-ssa-copy.c	(working copy)
@@ -366,7 +366,8 @@ set_copy_of_val (tree var, tree val)
   old = copy_of[ver].value;
   copy_of[ver].value = val;
 
-  if (old != val)
+  if (old != val
+      || (val && !operand_equal_p (old, val, 0)))
     return true;
 
   return false;
@@ -409,14 +410,9 @@ static enum ssa_prop_result
 copy_prop_visit_assignment (gimple stmt, tree *result_p)
 {
   tree lhs, rhs;
-  prop_value_t *rhs_val;
 
   lhs = gimple_assign_lhs (stmt);
-  rhs = gimple_assign_rhs1 (stmt);
-
-  gcc_assert (gimple_assign_rhs_code (stmt) == SSA_NAME);
-
-  rhs_val = get_copy_of_val (rhs);
+  rhs = valueize_val (gimple_assign_rhs1 (stmt));
 
   if (TREE_CODE (lhs) == SSA_NAME)
     {
@@ -425,14 +421,8 @@ copy_prop_visit_assignment (gimple stmt,
       if (!may_propagate_copy (lhs, rhs))
 	return SSA_PROP_VARYING;
 
-      /* Notice that in the case of assignments, we make the LHS be a
-	 copy of RHS's value, not of RHS itself.  This avoids keeping
-	 unnecessary copy-of chains (assignments cannot be in a cycle
-	 like PHI nodes), speeding up the propagation process.
-	 This is different from what we do in copy_prop_visit_phi_node.
-	 In those cases, we are interested in the copy-of chains.  */
       *result_p = lhs;
-      if (set_copy_of_val (*result_p, rhs_val->value))
+      if (set_copy_of_val (*result_p, rhs))
 	return SSA_PROP_INTERESTING;
       else
 	return SSA_PROP_NOT_INTERESTING;
@@ -518,7 +508,8 @@ copy_prop_visit_stmt (gimple stmt, edge
 
   if (gimple_assign_single_p (stmt)
       && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
-      && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
+      && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
+	  || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
     {
       /* If the statement is a copy assignment, evaluate its RHS to
 	 see if the lattice value of its output has changed.  */
@@ -631,7 +622,8 @@ copy_prop_visit_phi_node (gimple phi)
 
       /* If PHI_VAL and ARG don't have a common copy-of chain, then
 	 this PHI node cannot be a copy operation.  */
-      if (phi_val.value != arg_val->value)
+      if (phi_val.value != arg_val->value
+	  && !operand_equal_p (phi_val.value, arg_val->value, 0))
 	{
 	  phi_val.value = lhs;
 	  break;



More information about the Gcc-patches mailing list