From: Richard Biener Date: Fri, 7 Apr 2006 08:04:26 +0000 (+0000) Subject: re PR tree-optimization/26135 (store copyprop not effective) X-Git-Tag: releases/gcc-4.2.0~3388 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fcfa143ae553d1e83f7c32a15f615d02afd94b6c;p=thirdparty%2Fgcc.git re PR tree-optimization/26135 (store copyprop not effective) 2006-04-07 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f15b03e98bd1..505f08430e8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,11 @@ -2006-03-05 Robert Millan +2006-04-07 Richard Guenther + + PR tree-optimization/26135 + * tree-ssa-copy.c (stmt_may_generate_copy): Handle memory + loads for store copy-prop. + (copy_prop_visit_stmt): Likewise. + +2006-04-05 Robert Millan * gcc/config/i386/linux.h: Add a comment to mark macros that are being overriden in config/k*bsd-gnu.h. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41398327f3d6..b1543eaa02ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-04-07 Richard Guenther + + PR tree-optimization/26135 + * gcc.dg/tree-ssa/ssa-copyprop-1.c: New testcase. + 2006-04-06 Jan Hubicka PR profile/26399 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-1.c new file mode 100644 index 000000000000..4308cea78665 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-store_copyprop-details" } */ + +typedef struct { int i; int j; } A; +int foo(A *a, int i) +{ + a->i = i; + return a->i; +} + +/* { dg-final { scan-tree-dump "return i" "store_copyprop" } } */ +/* { dg-final { cleanup-tree-dump "store_copyprop" } } */ diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index d3bc53364fdc..fca44d76c055 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