Commit fc9962ee by Zdenek Dvorak Committed by Zdenek Dvorak

re PR tree-optimization/29801 (ICE in set_lattice_value (tree-ssa-ccp.c))

	PR tree-optimization/29801
	* tree-ssa-ccp.c (get_symbol_constant_value): New function.
	(get_default_value): Use get_symbol_constant_value.
	(set_lattice_value): ICE when the value of the constant is
	changed.
	(visit_assignment): Ignore VDEFs of read-only variables.

	* gcc.dg/pr29801.c: New test.

From-SVN: r118926
parent 80b4a8d9
2006-11-17 Zdenek Dvorak <dvorakz@suse.cz> 2006-11-17 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/29801
* tree-ssa-ccp.c (get_symbol_constant_value): New function.
(get_default_value): Use get_symbol_constant_value.
(set_lattice_value): ICE when the value of the constant is
changed.
(visit_assignment): Ignore VDEFs of read-only variables.
2006-11-17 Zdenek Dvorak <dvorakz@suse.cz>
* tree-vect-transform.c (vect_create_epilog_for_reduction): Fix * tree-vect-transform.c (vect_create_epilog_for_reduction): Fix
formating. formating.
(vect_generate_tmps_on_preheader, vect_update_ivs_after_vectorizer, (vect_generate_tmps_on_preheader, vect_update_ivs_after_vectorizer,
......
2006-11-17 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/29801
* gcc.dg/pr29801.c: New test.
2006-11-17 Jakub Jelinek <jakub@redhat.com> 2006-11-17 Jakub Jelinek <jakub@redhat.com>
PR middle-end/29584 PR middle-end/29584
/* We used to crash in ccp here, because the initial constant value of 2
was changed to 5. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
static const int a = 2;
int test (int param)
{
int *p = (int *) &a;
if (param)
*p = 5;
return a;
}
/* Check that we return the correct (unchanged) value. */
/* { dg-final { scan-tree-dump-times "return 2" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times "return 5" 0 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
...@@ -293,6 +293,24 @@ ccp_decl_initial_min_invariant (tree t) ...@@ -293,6 +293,24 @@ ccp_decl_initial_min_invariant (tree t)
return true; return true;
} }
/* If SYM is a constant variable with known value, return the value.
NULL_TREE is returned otherwise. */
static tree
get_symbol_constant_value (tree sym)
{
if (TREE_STATIC (sym)
&& TREE_READONLY (sym)
&& !MTAG_P (sym))
{
tree val = DECL_INITIAL (sym);
if (val
&& ccp_decl_initial_min_invariant (val))
return val;
}
return NULL_TREE;
}
/* Compute a default value for variable VAR and store it in the /* Compute a default value for variable VAR and store it in the
CONST_VAL array. The following rules are used to get default CONST_VAL array. The following rules are used to get default
...@@ -320,6 +338,7 @@ get_default_value (tree var) ...@@ -320,6 +338,7 @@ get_default_value (tree var)
{ {
tree sym = SSA_NAME_VAR (var); tree sym = SSA_NAME_VAR (var);
prop_value_t val = { UNINITIALIZED, NULL_TREE, NULL_TREE }; prop_value_t val = { UNINITIALIZED, NULL_TREE, NULL_TREE };
tree cst_val;
if (!do_store_ccp && !is_gimple_reg (var)) if (!do_store_ccp && !is_gimple_reg (var))
{ {
...@@ -333,16 +352,12 @@ get_default_value (tree var) ...@@ -333,16 +352,12 @@ get_default_value (tree var)
val.lattice_val = CONSTANT; val.lattice_val = CONSTANT;
val.value = SSA_NAME_VALUE (var); val.value = SSA_NAME_VALUE (var);
} }
else if (TREE_STATIC (sym) else if ((cst_val = get_symbol_constant_value (sym)) != NULL_TREE)
&& TREE_READONLY (sym)
&& !MTAG_P (sym)
&& DECL_INITIAL (sym)
&& ccp_decl_initial_min_invariant (DECL_INITIAL (sym)))
{ {
/* Globals and static variables declared 'const' take their /* Globals and static variables declared 'const' take their
initial value. */ initial value. */
val.lattice_val = CONSTANT; val.lattice_val = CONSTANT;
val.value = DECL_INITIAL (sym); val.value = cst_val;
val.mem_ref = sym; val.mem_ref = sym;
} }
else else
...@@ -415,9 +430,10 @@ set_lattice_value (tree var, prop_value_t new_val) ...@@ -415,9 +430,10 @@ set_lattice_value (tree var, prop_value_t new_val)
value. If *OLD_VAL and NEW_VAL are the same, return false to value. If *OLD_VAL and NEW_VAL are the same, return false to
inform the caller that this was a non-transition. */ inform the caller that this was a non-transition. */
gcc_assert (old_val->lattice_val <= new_val.lattice_val gcc_assert (old_val->lattice_val < new_val.lattice_val
|| (old_val->lattice_val == new_val.lattice_val || (old_val->lattice_val == new_val.lattice_val
&& old_val->value == new_val.value && ((!old_val->value && !new_val.value)
|| operand_equal_p (old_val->value, new_val.value, 0))
&& old_val->mem_ref == new_val.mem_ref)); && old_val->mem_ref == new_val.mem_ref));
if (old_val->lattice_val != new_val.lattice_val) if (old_val->lattice_val != new_val.lattice_val)
...@@ -1222,7 +1238,15 @@ visit_assignment (tree stmt, tree *output_p) ...@@ -1222,7 +1238,15 @@ visit_assignment (tree stmt, tree *output_p)
/* Set the value of every VDEF to VAL. */ /* Set the value of every VDEF to VAL. */
changed = false; changed = false;
FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, i, SSA_OP_VIRTUAL_DEFS) FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, i, SSA_OP_VIRTUAL_DEFS)
changed |= set_lattice_value (vdef, val); {
/* See PR 29801. We may have VDEFs for read-only variables
(see the handling of unmodifiable variables in
add_virtual_operand); do not attempt to change their value. */
if (get_symbol_constant_value (SSA_NAME_VAR (vdef)) != NULL_TREE)
continue;
changed |= set_lattice_value (vdef, val);
}
/* Note that for propagation purposes, we are only interested in /* Note that for propagation purposes, we are only interested in
visiting statements that load the exact same memory reference visiting statements that load the exact same memory reference
......
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