re PR tree-optimization/22422 (ICE in first_vi_for_offset, at tree-ssa-structalias.c:2843)

2005-07-12  Daniel Berlin  <dberlin@dberlin.org>

	Fix PR tree-optimization/22422
	* tree-ssa-structalias.c (struct variable_info): Add flag for
	special vars.
	(get_varinfo): Now a static function.
	(new_varinfo): init has_union and is_special_var to false.
	(solution_set_add): Check has_union.
	(do_da_constraint): Move temporary variable so it gets reset
	properly.
	Also check for special variable.
	(do_ds_constraint): Ditto.
	(do_sd_constraint): Ditto.
	(do_structure_copy): Check for special variable.
	(find_func_aliases): Ditto.
	(init_base_vars): Set special vars properly.

From-SVN: r101959
This commit is contained in:
Daniel Berlin 2005-07-13 02:25:48 +00:00 committed by Daniel Berlin
parent 58deefdeb8
commit 13c2c08bad
2 changed files with 51 additions and 13 deletions

View File

@ -1,3 +1,20 @@
2005-07-12 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/22422
* tree-ssa-structalias.c (struct variable_info): Add flag for
special vars.
(get_varinfo): Now a static function.
(new_varinfo): init has_union and is_special_var to false.
(solution_set_add): Check has_union.
(do_da_constraint): Move temporary variable so it gets reset
properly.
Also check for special variable.
(do_ds_constraint): Ditto.
(do_sd_constraint): Ditto.
(do_structure_copy): Check for special variable.
(find_func_aliases): Ditto.
(init_base_vars): Set special vars properly.
2005-07-13 Jan Hubicka <jh@suse.cz> 2005-07-13 Jan Hubicka <jh@suse.cz>
* cfgexpand.c (expand_one_stack_var): Do not expand variables when we * cfgexpand.c (expand_one_stack_var): Do not expand variables when we

View File

@ -216,6 +216,10 @@ struct variable_info
/* True if this is a variable created by the constraint analysis, such as /* True if this is a variable created by the constraint analysis, such as
heap variables and constraints we had to break up. */ heap variables and constraints we had to break up. */
unsigned int is_artificial_var:1; unsigned int is_artificial_var:1;
/* True if this is a special variable whose solution set should not be
changed. */
unsigned int is_special_var:1;
/* True for variables whose size is not known or variable. */ /* True for variables whose size is not known or variable. */
unsigned int is_unknown_size_var:1; unsigned int is_unknown_size_var:1;
@ -250,7 +254,14 @@ DEF_VEC_ALLOC_P(varinfo_t, heap);
/* Table of variable info structures for constraint variables. Indexed directly /* Table of variable info structures for constraint variables. Indexed directly
by variable info id. */ by variable info id. */
static VEC(varinfo_t,heap) *varmap; static VEC(varinfo_t,heap) *varmap;
#define get_varinfo(n) VEC_index(varinfo_t, varmap, n)
/* Return the varmap element N */
static inline varinfo_t
get_varinfo(unsigned int n)
{
return VEC_index(varinfo_t, varmap, n);
}
/* Variable that represents the unknown pointer. */ /* Variable that represents the unknown pointer. */
static varinfo_t var_anything; static varinfo_t var_anything;
@ -296,7 +307,9 @@ new_var_info (tree t, unsigned int id, const char *name, unsigned int node)
ret->indirect_target = false; ret->indirect_target = false;
ret->is_artificial_var = false; ret->is_artificial_var = false;
ret->is_heap_var = false; ret->is_heap_var = false;
ret->is_special_var = false;
ret->is_unknown_size_var = false; ret->is_unknown_size_var = false;
ret->has_union = false;
ret->solution = BITMAP_ALLOC (&ptabitmap_obstack); ret->solution = BITMAP_ALLOC (&ptabitmap_obstack);
bitmap_clear (ret->solution); bitmap_clear (ret->solution);
ret->variables = BITMAP_ALLOC (&ptabitmap_obstack); ret->variables = BITMAP_ALLOC (&ptabitmap_obstack);
@ -602,6 +615,7 @@ solution_set_add (bitmap set, unsigned HOST_WIDE_INT offset)
bitmap_set_bit (result, v->id); bitmap_set_bit (result, v->id);
} }
else if (get_varinfo (i)->is_artificial_var else if (get_varinfo (i)->is_artificial_var
|| get_varinfo (i)->has_union
|| get_varinfo (i)->is_unknown_size_var) || get_varinfo (i)->is_unknown_size_var)
{ {
bitmap_set_bit (result, i); bitmap_set_bit (result, i);
@ -1298,20 +1312,21 @@ do_da_constraint (constraint_graph_t graph ATTRIBUTE_UNUSED,
constraint_t c, bitmap delta) constraint_t c, bitmap delta)
{ {
unsigned int rhs = c->rhs.var; unsigned int rhs = c->rhs.var;
unsigned HOST_WIDE_INT offset = c->lhs.offset;
unsigned int j; unsigned int j;
bitmap_iterator bi; bitmap_iterator bi;
/* For each member j of Delta (Sol(x)), add x to Sol(j) */ /* For each member j of Delta (Sol(x)), add x to Sol(j) */
EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
{ {
if (type_safe (j, &offset)) unsigned HOST_WIDE_INT offset = c->lhs.offset;
if (type_safe (j, &offset) && !(get_varinfo (j)->is_special_var))
{ {
/* *x != NULL && *x != ANYTHING*/ /* *x != NULL && *x != ANYTHING*/
varinfo_t v; varinfo_t v;
unsigned int t; unsigned int t;
bitmap sol; bitmap sol;
unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + offset; unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + offset;
v = first_vi_for_offset (get_varinfo (j), fieldoffset); v = first_vi_for_offset (get_varinfo (j), fieldoffset);
t = v->node; t = v->node;
sol = get_varinfo (t)->solution; sol = get_varinfo (t)->solution;
@ -1325,7 +1340,7 @@ do_da_constraint (constraint_graph_t graph ATTRIBUTE_UNUSED,
} }
} }
} }
else if (dump_file) else if (dump_file && !(get_varinfo (j)->is_special_var))
fprintf (dump_file, "Untypesafe usage in do_da_constraint.\n"); fprintf (dump_file, "Untypesafe usage in do_da_constraint.\n");
} }
@ -1339,7 +1354,6 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
bitmap delta) bitmap delta)
{ {
unsigned int lhs = get_varinfo (c->lhs.var)->node; unsigned int lhs = get_varinfo (c->lhs.var)->node;
unsigned HOST_WIDE_INT roffset = c->rhs.offset;
bool flag = false; bool flag = false;
bitmap sol = get_varinfo (lhs)->solution; bitmap sol = get_varinfo (lhs)->solution;
unsigned int j; unsigned int j;
@ -1349,6 +1363,7 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
an edge in the graph from j to x, and union Sol(j) into Sol(x). */ an edge in the graph from j to x, and union Sol(j) into Sol(x). */
EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
{ {
unsigned HOST_WIDE_INT roffset = c->rhs.offset;
if (type_safe (j, &roffset)) if (type_safe (j, &roffset))
{ {
varinfo_t v; varinfo_t v;
@ -1360,7 +1375,7 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
if (int_add_graph_edge (graph, lhs, t, 0)) if (int_add_graph_edge (graph, lhs, t, 0))
flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
} }
else if (dump_file) else if (dump_file && !(get_varinfo (j)->is_special_var))
fprintf (dump_file, "Untypesafe usage in do_sd_constraint\n"); fprintf (dump_file, "Untypesafe usage in do_sd_constraint\n");
} }
@ -1383,7 +1398,6 @@ static void
do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
{ {
unsigned int rhs = get_varinfo (c->rhs.var)->node; unsigned int rhs = get_varinfo (c->rhs.var)->node;
unsigned HOST_WIDE_INT loff = c->lhs.offset;
unsigned HOST_WIDE_INT roff = c->rhs.offset; unsigned HOST_WIDE_INT roff = c->rhs.offset;
bitmap sol = get_varinfo (rhs)->solution; bitmap sol = get_varinfo (rhs)->solution;
unsigned int j; unsigned int j;
@ -1393,7 +1407,8 @@ do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
union Sol(y) into Sol(j) */ union Sol(y) into Sol(j) */
EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
{ {
if (type_safe (j, &loff)) unsigned HOST_WIDE_INT loff = c->lhs.offset;
if (type_safe (j, &loff) && !(get_varinfo(j)->is_special_var))
{ {
varinfo_t v; varinfo_t v;
unsigned int t; unsigned int t;
@ -1419,7 +1434,7 @@ do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
} }
} }
} }
else if (dump_file) else if (dump_file && !(get_varinfo (j)->is_special_var))
fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n"); fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n");
} }
} }
@ -1446,7 +1461,8 @@ do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
else else
{ {
/* x = *y */ /* x = *y */
do_sd_constraint (graph, c, delta); if (!(get_varinfo (c->lhs.var)->is_special_var))
do_sd_constraint (graph, c, delta);
} }
} }
@ -2389,7 +2405,7 @@ do_structure_copy (tree lhsop, tree rhsop)
rhs = get_constraint_for (rhsop); rhs = get_constraint_for (rhsop);
/* If we have special var = x, swap it around. */ /* If we have special var = x, swap it around. */
if (lhs.var <= integer_id && rhs.var > integer_id) if (lhs.var <= integer_id && !(get_varinfo (rhs.var)->is_special_var))
{ {
tmp = lhs; tmp = lhs;
lhs = rhs; lhs = rhs;
@ -2400,7 +2416,7 @@ do_structure_copy (tree lhsop, tree rhsop)
possible it's something we could handle. However, most cases falling possible it's something we could handle. However, most cases falling
into this are dealing with transparent unions, which are slightly into this are dealing with transparent unions, which are slightly
weird. */ weird. */
if (rhs.type == ADDRESSOF && rhs.var > integer_id) if (rhs.type == ADDRESSOF && !(get_varinfo (rhs.var)->is_special_var))
{ {
rhs.type = ADDRESSOF; rhs.type = ADDRESSOF;
rhs.var = anything_id; rhs.var = anything_id;
@ -2773,7 +2789,7 @@ find_func_aliases (tree t, struct alias_info *ai)
type, from the LHS we can access any field type, from the LHS we can access any field
of the RHS. */ of the RHS. */
if (rhs.type == ADDRESSOF if (rhs.type == ADDRESSOF
&& rhs.var > anything_id && !(get_varinfo (rhs.var)->is_special_var)
&& AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (rhsop)))) && AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (rhsop))))
{ {
rhs.var = anyoffset_id; rhs.var = anyoffset_id;
@ -3364,6 +3380,7 @@ init_base_vars (void)
var_nothing->offset = 0; var_nothing->offset = 0;
var_nothing->size = ~0; var_nothing->size = ~0;
var_nothing->fullsize = ~0; var_nothing->fullsize = ~0;
var_nothing->is_special_var = 1;
nothing_id = 0; nothing_id = 0;
VEC_safe_push (varinfo_t, heap, varmap, var_nothing); VEC_safe_push (varinfo_t, heap, varmap, var_nothing);
@ -3377,6 +3394,7 @@ init_base_vars (void)
var_anything->offset = 0; var_anything->offset = 0;
var_anything->next = NULL; var_anything->next = NULL;
var_anything->fullsize = ~0; var_anything->fullsize = ~0;
var_anything->is_special_var = 1;
anything_id = 1; anything_id = 1;
/* Anything points to anything. This makes deref constraints just /* Anything points to anything. This makes deref constraints just
@ -3405,6 +3423,7 @@ init_base_vars (void)
var_readonly->size = ~0; var_readonly->size = ~0;
var_readonly->fullsize = ~0; var_readonly->fullsize = ~0;
var_readonly->next = NULL; var_readonly->next = NULL;
var_readonly->is_special_var = 1;
insert_id_for_tree (readonly_tree, 2); insert_id_for_tree (readonly_tree, 2);
readonly_id = 2; readonly_id = 2;
VEC_safe_push (varinfo_t, heap, varmap, var_readonly); VEC_safe_push (varinfo_t, heap, varmap, var_readonly);
@ -3432,6 +3451,7 @@ init_base_vars (void)
var_integer->fullsize = ~0; var_integer->fullsize = ~0;
var_integer->offset = 0; var_integer->offset = 0;
var_integer->next = NULL; var_integer->next = NULL;
var_integer->is_special_var = 1;
integer_id = 3; integer_id = 3;
VEC_safe_push (varinfo_t, heap, varmap, var_integer); VEC_safe_push (varinfo_t, heap, varmap, var_integer);
@ -3459,6 +3479,7 @@ init_base_vars (void)
var_anyoffset->offset = 0; var_anyoffset->offset = 0;
var_anyoffset->next = NULL; var_anyoffset->next = NULL;
var_anyoffset->fullsize = ~0; var_anyoffset->fullsize = ~0;
var_anyoffset->is_special_var = 1;
VEC_safe_push (varinfo_t, heap, varmap, var_anyoffset); VEC_safe_push (varinfo_t, heap, varmap, var_anyoffset);
/* ANYOFFSET points to ANYOFFSET. */ /* ANYOFFSET points to ANYOFFSET. */