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
This commit is contained in:
Richard Biener 2006-04-07 08:04:26 +00:00
parent b8cf62e42f
commit fcfa143ae5
4 changed files with 57 additions and 2 deletions

View file

@ -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.

View file

@ -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

View file

@ -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" } } */

View file

@ -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