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

2005-08-14  Daniel Berlin  <dberlin@dberlin.org>

	Fix PR tree-optimization/22615

	* tree-ssa-structalias.c (solution_set_add): Handle
	first_vi_for_offset returning NULL.
	(do_da_constraint): Ditto.
	(do_sd_constraint): Ditto.
	(do_ds_constraint): Ditto
	(find_func_aliases): Ditto.
	(build_constraint_graph): RHS is allowed be ANYTHING.
	(first_vi_for_offset): Return NULL if we couldn't find anything at
	the offset.

From-SVN: r103083
This commit is contained in:
Daniel Berlin 2005-08-14 19:23:56 +00:00 committed by Daniel Berlin
parent c5b2a111dc
commit 8971094d72
3 changed files with 53 additions and 4 deletions

View File

@ -1,3 +1,17 @@
2005-08-14 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/22615
* tree-ssa-structalias.c (solution_set_add): Handle
first_vi_for_offset returning NULL.
(do_da_constraint): Ditto.
(do_sd_constraint): Ditto.
(do_ds_constraint): Ditto
(find_func_aliases): Ditto.
(build_constraint_graph): RHS is allowed be ANYTHING.
(first_vi_for_offset): Return NULL if we couldn't find anything at
the offset.
2005-08-14 Ulrich Weigand <uweigand@de.ibm.com>
* config/s390/s390.c (s390_canonicalize_comparison): Prefer register

View File

@ -0,0 +1,28 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* Ensure that we don't crash when people decide to return the address of padding. */
struct A
{
char c;
int i;
};
A a;
struct B
{
char c, d;
};
union C
{
A *p;
B *q;
C() : p(&a) {}
char& foo() { return q->d; }
};
void bar() { C().foo() = 0; }

View File

@ -612,6 +612,8 @@ solution_set_add (bitmap set, unsigned HOST_WIDE_INT offset)
{
unsigned HOST_WIDE_INT fieldoffset = get_varinfo (i)->offset + offset;
varinfo_t v = first_vi_for_offset (get_varinfo (i), fieldoffset);
if (!v)
continue;
bitmap_set_bit (result, v->id);
}
else if (get_varinfo (i)->is_artificial_var
@ -997,7 +999,7 @@ build_constraint_graph (void)
/* x = &y */
bitmap_set_bit (get_varinfo (lhs.var)->solution, rhs.var);
}
else if (rhs.var > anything_id && lhs.var > anything_id)
else if (lhs.var > anything_id)
{
/* Ignore 0 weighted self edges, as they can't possibly contribute
anything */
@ -1332,6 +1334,8 @@ do_da_constraint (constraint_graph_t graph ATTRIBUTE_UNUSED,
unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + offset;
v = first_vi_for_offset (get_varinfo (j), fieldoffset);
if (!v)
continue;
t = v->node;
sol = get_varinfo (t)->solution;
if (!bitmap_bit_p (sol, rhs))
@ -1375,6 +1379,8 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
unsigned int t;
v = first_vi_for_offset (get_varinfo (j), fieldoffset);
if (!v)
continue;
t = v->node;
if (int_add_graph_edge (graph, lhs, t, 0))
flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
@ -1419,6 +1425,8 @@ do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + loff;
v = first_vi_for_offset (get_varinfo (j), fieldoffset);
if (!v)
continue;
t = v->node;
if (int_add_graph_edge (graph, t, rhs, roff))
{
@ -2878,7 +2886,7 @@ find_func_aliases (tree t, struct alias_info *ai)
OFFSET.
Effectively, walk the chain of fields for the variable START to find the
first field that overlaps with OFFSET.
Abort if we can't find one. */
Return NULL if we can't find one. */
static varinfo_t
first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
@ -2894,8 +2902,7 @@ first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
return curr;
curr = curr->next;
}
gcc_unreachable ();
return NULL;
}