Commit a318e3ac by Steven Bosscher Committed by Steven Bosscher

re PR tree-optimization/21574 (store_ccp doesn't see through a store.)

	PR tree-optimization/21574
	* tree-ssa-ccp.c (likely_value): If the right hand side is a
	constant, return CONSTANT.
	(ccp_lattice_meet): Use operand_equal_p instead of simple_cst_equal.
	(ccp_fold, visit_assignment): Likewise.
	(evaluate_stmt): Handle UNDEFINED and UNKNOWN_VAL the same way.

From-SVN: r103206
parent a7edd66b
2005-08-17 Steven Bosscher <stevenb@suse.de>
PR tree-optimization/21574
* tree-ssa-ccp.c (likely_value): If the right hand side is a
constant, return CONSTANT.
(ccp_lattice_meet): Use operand_equal_p instead of simple_cst_equal.
(ccp_fold, visit_assignment): Likewise.
(evaluate_stmt): Handle UNDEFINED and UNKNOWN_VAL the same way.
2005-08-16 James A. Morrison <phython@gcc.gnu.org> 2005-08-16 James A. Morrison <phython@gcc.gnu.org>
* c-typeck.c (build_function_call): Call fold_buildN_initializer or * c-typeck.c (build_function_call): Call fold_buildN_initializer or
......
2005-08-17 Steven Bosscher <stevenb@suse.de>
PR tree-optimization/21574
* gcc.dg/tree-ssa/pr21574.c: New test.
2005-08-16 James E Wilson <wilson@specifix.com> 2005-08-16 James E Wilson <wilson@specifix.com>
* gcc.dg/large-size-array.c (DIM): Use USHRT_MAX not USHORT_MAX. * gcc.dg/large-size-array.c (DIM): Use USHRT_MAX not USHORT_MAX.
......
/* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-store_ccp" } */
int
foo (int *p)
{
*p = 0;
return *p;
}
/* The store to *p should be propagated to the return statement. */
/* { dg-final { scan-tree-dump-times "return 0" 1 "store_ccp" } } */
/* { dg-final { cleanup-tree-dump "store_ccp" } } */
...@@ -473,6 +473,9 @@ likely_value (tree stmt) ...@@ -473,6 +473,9 @@ likely_value (tree stmt)
&& TREE_CODE (stmt) != SWITCH_EXPR) && TREE_CODE (stmt) != SWITCH_EXPR)
return VARYING; return VARYING;
if (is_gimple_min_invariant (get_rhs (stmt)))
return CONSTANT;
found_constant = false; found_constant = false;
FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE|SSA_OP_VUSE) FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
{ {
...@@ -658,7 +661,8 @@ ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2) ...@@ -658,7 +661,8 @@ ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
&& val2->lattice_val == CONSTANT && val2->lattice_val == CONSTANT
&& simple_cst_equal (val1->value, val2->value) == 1 && simple_cst_equal (val1->value, val2->value) == 1
&& (!do_store_ccp && (!do_store_ccp
|| simple_cst_equal (val1->mem_ref, val2->mem_ref) == 1)) || (val1->mem_ref && val2->mem_ref
&& operand_equal_p (val1->mem_ref, val2->mem_ref, 0))))
{ {
/* Ci M Cj = Ci if (i == j) /* Ci M Cj = Ci if (i == j)
Ci M Cj = VARYING if (i != j) Ci M Cj = VARYING if (i != j)
...@@ -826,7 +830,8 @@ ccp_fold (tree stmt) ...@@ -826,7 +830,8 @@ ccp_fold (tree stmt)
/* If the RHS is a memory load, see if the VUSEs associated with /* If the RHS is a memory load, see if the VUSEs associated with
it are a valid constant for that memory load. */ it are a valid constant for that memory load. */
prop_value_t *val = get_value_loaded_by (stmt, const_val); prop_value_t *val = get_value_loaded_by (stmt, const_val);
if (val && simple_cst_equal (val->mem_ref, rhs) == 1) if (val && val->mem_ref
&& operand_equal_p (val->mem_ref, rhs, 0))
return val->value; return val->value;
else else
return NULL_TREE; return NULL_TREE;
...@@ -1085,7 +1090,11 @@ evaluate_stmt (tree stmt) ...@@ -1085,7 +1090,11 @@ evaluate_stmt (tree stmt)
/* The statement produced a nonconstant value. If the statement /* The statement produced a nonconstant value. If the statement
had UNDEFINED operands, then the result of the statement had UNDEFINED operands, then the result of the statement
should be UNDEFINED. Otherwise, the statement is VARYING. */ should be UNDEFINED. Otherwise, the statement is VARYING. */
val.lattice_val = (likelyvalue == UNDEFINED) ? UNDEFINED : VARYING; if (likelyvalue == UNDEFINED || likelyvalue == UNKNOWN_VAL)
val.lattice_val = likelyvalue;
else
val.lattice_val = VARYING;
val.value = NULL_TREE; val.value = NULL_TREE;
} }
...@@ -1122,7 +1131,8 @@ visit_assignment (tree stmt, tree *output_p) ...@@ -1122,7 +1131,8 @@ visit_assignment (tree stmt, tree *output_p)
we can propagate the value on the RHS. */ we can propagate the value on the RHS. */
prop_value_t *nval = get_value_loaded_by (stmt, const_val); prop_value_t *nval = get_value_loaded_by (stmt, const_val);
if (nval && simple_cst_equal (nval->mem_ref, rhs) == 1) if (nval && nval->mem_ref
&& operand_equal_p (nval->mem_ref, rhs, 0))
val = *nval; val = *nval;
else else
val = evaluate_stmt (stmt); val = evaluate_stmt (stmt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment