aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-1.c12
-rw-r--r--gcc/tree-ssa-copy.c33
4 files changed, 57 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f15b03e..505f084 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,11 @@
-2006-03-05 Robert Millan <robertmh@gnu.org>
+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.
+
+2006-04-05 Robert Millan <robertmh@gnu.org>
* 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 4139832..b1543ea 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-07 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/26135
+ * gcc.dg/tree-ssa/ssa-copyprop-1.c: New testcase.
+
2006-04-06 Jan Hubicka <jh@suse.cz>
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 0000000..4308cea
--- /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 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