diff options
author | Richard Biener <rguenth@gcc.gnu.org> | 2006-04-07 08:04:26 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-04-07 08:04:26 +0000 |
commit | fcfa143ae553d1e83f7c32a15f615d02afd94b6c (patch) | |
tree | 274ecfebe98b30c94224543eddf17c99df847ef5 /gcc/tree-ssa-copy.c | |
parent | b8cf62e42fc5ea65ba7da8ebe2e990486ce588d3 (diff) | |
download | gcc-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.c | 33 |
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 |