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
This commit is contained in:
parent
a7edd66b06
commit
a318e3acf8
@ -1,3 +1,12 @@
|
||||
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>
|
||||
|
||||
* c-typeck.c (build_function_call): Call fold_buildN_initializer or
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
* gcc.dg/large-size-array.c (DIM): Use USHRT_MAX not USHORT_MAX.
|
||||
|
13
gcc/testsuite/gcc.dg/tree-ssa/pr21574.c
Normal file
13
gcc/testsuite/gcc.dg/tree-ssa/pr21574.c
Normal file
@ -0,0 +1,13 @@
|
||||
/* { 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)
|
||||
&& TREE_CODE (stmt) != SWITCH_EXPR)
|
||||
return VARYING;
|
||||
|
||||
if (is_gimple_min_invariant (get_rhs (stmt)))
|
||||
return CONSTANT;
|
||||
|
||||
found_constant = false;
|
||||
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)
|
||||
&& val2->lattice_val == CONSTANT
|
||||
&& simple_cst_equal (val1->value, val2->value) == 1
|
||||
&& (!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 = VARYING if (i != j)
|
||||
@ -826,7 +830,8 @@ ccp_fold (tree stmt)
|
||||
/* If the RHS is a memory load, see if the VUSEs associated with
|
||||
it are a valid constant for that memory load. */
|
||||
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;
|
||||
else
|
||||
return NULL_TREE;
|
||||
@ -1085,7 +1090,11 @@ evaluate_stmt (tree stmt)
|
||||
/* The statement produced a nonconstant value. If the statement
|
||||
had UNDEFINED operands, then the result of the statement
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1122,7 +1131,8 @@ visit_assignment (tree stmt, tree *output_p)
|
||||
we can propagate the value on the RHS. */
|
||||
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;
|
||||
else
|
||||
val = evaluate_stmt (stmt);
|
||||
|
Loading…
x
Reference in New Issue
Block a user