aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-structalias.c
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2005-08-14 19:23:56 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2005-08-14 19:23:56 +0000
commit8971094d72ac03277fefdcd65e9bb449ecb3dae0 (patch)
treee55e265577b39245ffd869604a9f3bdfdc0923fe /gcc/tree-ssa-structalias.c
parentc5b2a111dcea3bd2e618676d2761a1570c145dcd (diff)
downloadgcc-8971094d72ac03277fefdcd65e9bb449ecb3dae0.zip
gcc-8971094d72ac03277fefdcd65e9bb449ecb3dae0.tar.gz
gcc-8971094d72ac03277fefdcd65e9bb449ecb3dae0.tar.bz2
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
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r--gcc/tree-ssa-structalias.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 13b9751..cad485a 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -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;
}