aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-copy.c
diff options
context:
space:
mode:
authorRichard Biener <rguenth@gcc.gnu.org>2006-04-07 08:04:26 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2006-04-07 08:04:26 +0000
commitfcfa143ae553d1e83f7c32a15f615d02afd94b6c (patch)
tree274ecfebe98b30c94224543eddf17c99df847ef5 /gcc/tree-ssa-copy.c
parentb8cf62e42fc5ea65ba7da8ebe2e990486ce588d3 (diff)
downloadgcc-fcfa143ae553d1e83f7c32a15f615d02afd94b6c.zip
gcc-fcfa143ae553d1e83f7c32a15f615d02afd94b6c.tar.gz
gcc-fcfa143ae553d1e83f7c32a15f615d02afd94b6c.tar.bz2
re PR tree-optimization/26135 (store copyprop not effective)
2006-04-07 Richard Guenther <rguenther@suse.de> PR tree-optimization/26135 * tree-ssa-copy.c (stmt_may_generate_copy): Handle memory loads for store copy-prop. (copy_prop_visit_stmt): Likewise. * gcc.dg/tree-ssa/ssa-copyprop-1.c: New testcase. From-SVN: r112749
Diffstat (limited to 'gcc/tree-ssa-copy.c')
-rw-r--r--gcc/tree-ssa-copy.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c
index d3bc533..fca44d76 100644
--- a/gcc/tree-ssa-copy.c
+++ b/gcc/tree-ssa-copy.c
@@ -376,7 +376,10 @@ stmt_may_generate_copy (tree stmt)
/* Otherwise, the only statements that generate useful copies are
assignments whose RHS is just an SSA name that doesn't flow
through abnormal edges. */
- return TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs);
+ return (do_store_copy_prop
+ && TREE_CODE (lhs) == SSA_NAME)
+ || (TREE_CODE (rhs) == SSA_NAME
+ && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs));
}
@@ -681,6 +684,34 @@ copy_prop_visit_stmt (tree stmt, edge *taken_edge_p, tree *result_p)
see if the lattice value of its output has changed. */
retval = copy_prop_visit_assignment (stmt, result_p);
}
+ else if (TREE_CODE (stmt) == MODIFY_EXPR
+ && TREE_CODE (TREE_OPERAND (stmt, 0)) == SSA_NAME
+ && do_store_copy_prop
+ && stmt_makes_single_load (stmt))
+ {
+ /* If the statement is a copy assignment with a memory load
+ on the RHS, see if we know the value of this load and
+ update the lattice accordingly. */
+ prop_value_t *val = get_value_loaded_by (stmt, copy_of);
+ if (val
+ && val->mem_ref
+ && is_gimple_reg (val->value)
+ && operand_equal_p (val->mem_ref, TREE_OPERAND (stmt, 1), 0))
+ {
+ bool changed;
+ changed = set_copy_of_val (TREE_OPERAND (stmt, 0),
+ val->value, val->mem_ref);
+ if (changed)
+ {
+ *result_p = TREE_OPERAND (stmt, 0);
+ retval = SSA_PROP_INTERESTING;
+ }
+ else
+ retval = SSA_PROP_NOT_INTERESTING;
+ }
+ else
+ retval = SSA_PROP_VARYING;
+ }
else if (TREE_CODE (stmt) == COND_EXPR)
{
/* See if we can determine which edge goes out of a conditional