diff options
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 658 |
1 files changed, 114 insertions, 544 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 42099ddedd4..828481c5680 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -434,53 +434,14 @@ struct constraint static VEC(constraint_t,heap) *constraints; static alloc_pool constraint_pool; -/* An edge in the weighted constraint graph. The edges are weighted, - with a bit set in weights meaning their is an edge with that - weight. - We don't keep the src in the edge, because we always know what it - is. */ -struct constraint_edge -{ - unsigned int dest; - bitmap weights; -}; - -typedef struct constraint_edge *constraint_edge_t; -static alloc_pool constraint_edge_pool; - -/* Return a new constraint edge from SRC to DEST. */ - -static constraint_edge_t -new_constraint_edge (unsigned int dest) -{ - constraint_edge_t ret = pool_alloc (constraint_edge_pool); - ret->dest = dest; - ret->weights = NULL; - return ret; -} - -DEF_VEC_P(constraint_edge_t); -DEF_VEC_ALLOC_P(constraint_edge_t,heap); - - -/* The constraint graph is represented internally in two different - ways. The overwhelming majority of edges in the constraint graph - are zero weigh edges, and thus, using a vector of contrainst_edge_t - is a waste of time and memory, since they have no weights. We - simply use a bitmap to store the preds and succs for each node. - The weighted edges are stored as a set of adjacency vectors, one - per variable. succs[x] is the vector of successors for variable x, - and preds[x] is the vector of predecessors for variable x. IOW, - all edges are "forward" edges, which is not like our CFG. So - remember that preds[x]->src == x, and succs[x]->src == x. */ +/* The constraint graph is represented as an array of bitmaps + containing successor nodes. */ struct constraint_graph { - bitmap *zero_weight_succs; - bitmap *zero_weight_preds; - VEC(constraint_edge_t,heap) **succs; - VEC(constraint_edge_t,heap) **preds; + bitmap *succs; + bitmap *preds; }; typedef struct constraint_graph *constraint_graph_t; @@ -739,44 +700,6 @@ insert_into_complex (unsigned int var, constraint_t c) } -/* Compare two constraint edges A and B, return true if they are equal. */ - -static bool -constraint_edge_equal (struct constraint_edge a, struct constraint_edge b) -{ - return a.dest == b.dest; -} - -/* Compare two constraint edges, return true if A is less than B */ - -static bool -constraint_edge_less (const constraint_edge_t a, const constraint_edge_t b) -{ - if (a->dest < b->dest) - return true; - return false; -} - -/* Find the constraint edge that matches LOOKFOR, in VEC. - Return the edge, if found, NULL otherwise. */ - -static constraint_edge_t -constraint_edge_vec_find (VEC(constraint_edge_t,heap) *vec, - struct constraint_edge lookfor) -{ - unsigned int place; - constraint_edge_t edge = NULL; - - place = VEC_lower_bound (constraint_edge_t, vec, &lookfor, - constraint_edge_less); - if (place >= VEC_length (constraint_edge_t, vec)) - return NULL; - edge = VEC_index (constraint_edge_t, vec, place); - if (!constraint_edge_equal (*edge, lookfor)) - return NULL; - return edge; -} - /* Condense two variable nodes into a single variable node, by moving all associated info from SRC to TO. */ @@ -815,206 +738,43 @@ condense_varmap_nodes (unsigned int to, unsigned int src) srcvi->complex = NULL; } -/* Erase an edge from SRC to SRC from GRAPH. This routine only - handles self-edges (e.g. an edge from a to a). */ - -static void -erase_graph_self_edge (constraint_graph_t graph, unsigned int src) -{ - VEC(constraint_edge_t,heap) *predvec = graph->preds[src]; - VEC(constraint_edge_t,heap) *succvec = graph->succs[src]; - struct constraint_edge edge; - unsigned int place; - - edge.dest = src; - - /* Remove from the successors. */ - place = VEC_lower_bound (constraint_edge_t, succvec, &edge, - constraint_edge_less); - - /* Make sure we found the edge. */ -#ifdef ENABLE_CHECKING - { - constraint_edge_t tmp = VEC_index (constraint_edge_t, succvec, place); - gcc_assert (constraint_edge_equal (*tmp, edge)); - } -#endif - VEC_ordered_remove (constraint_edge_t, succvec, place); - - /* Remove from the predecessors. */ - place = VEC_lower_bound (constraint_edge_t, predvec, &edge, - constraint_edge_less); - - /* Make sure we found the edge. */ -#ifdef ENABLE_CHECKING - { - constraint_edge_t tmp = VEC_index (constraint_edge_t, predvec, place); - gcc_assert (constraint_edge_equal (*tmp, edge)); - } -#endif - VEC_ordered_remove (constraint_edge_t, predvec, place); -} /* Remove edges involving NODE from GRAPH. */ static void clear_edges_for_node (constraint_graph_t graph, unsigned int node) { - VEC(constraint_edge_t,heap) *succvec = graph->succs[node]; - VEC(constraint_edge_t,heap) *predvec = graph->preds[node]; bitmap_iterator bi; unsigned int j; - constraint_edge_t c = NULL; - int i; /* Walk the successors, erase the associated preds. */ - EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[node], 0, j, bi) + EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[node], 0, j, bi) if (j != node) - bitmap_clear_bit (graph->zero_weight_preds[j], node); + bitmap_clear_bit (graph->preds[j], node); - for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++) - if (c->dest != node) - { - unsigned int place; - struct constraint_edge lookfor; - constraint_edge_t result; - - lookfor.dest = node; - place = VEC_lower_bound (constraint_edge_t, graph->preds[c->dest], - &lookfor, constraint_edge_less); - result = VEC_ordered_remove (constraint_edge_t, - graph->preds[c->dest], place); - pool_free (constraint_edge_pool, result); - } /* Walk the preds, erase the associated succs. */ - EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[node], 0, j, bi) + EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[node], 0, j, bi) if (j != node) - bitmap_clear_bit (graph->zero_weight_succs[j], node); + bitmap_clear_bit (graph->succs[j], node); - for (i =0; VEC_iterate (constraint_edge_t, predvec, i, c); i++) - if (c->dest != node) - { - unsigned int place; - struct constraint_edge lookfor; - constraint_edge_t result; - - lookfor.dest = node; - place = VEC_lower_bound (constraint_edge_t, graph->succs[c->dest], - &lookfor, constraint_edge_less); - result = VEC_ordered_remove (constraint_edge_t, - graph->succs[c->dest], place); - pool_free (constraint_edge_pool, result); - } - - if (graph->zero_weight_preds[node]) + if (graph->preds[node]) { - BITMAP_FREE (graph->zero_weight_preds[node]); - graph->zero_weight_preds[node] = NULL; + BITMAP_FREE (graph->preds[node]); + graph->preds[node] = NULL; } - if (graph->zero_weight_succs[node]) - { - BITMAP_FREE (graph->zero_weight_succs[node]); - graph->zero_weight_succs[node] = NULL; - } - - VEC_free (constraint_edge_t, heap, graph->preds[node]); - VEC_free (constraint_edge_t, heap, graph->succs[node]); - graph->preds[node] = NULL; - graph->succs[node] = NULL; -} - -static bool edge_added = false; - -/* Add edge (src, dest) to the graph. */ - -static bool -add_graph_edge (constraint_graph_t graph, unsigned int src, unsigned int dest) -{ - unsigned int place; - VEC(constraint_edge_t,heap) *vec; - struct constraint_edge newe; - newe.dest = dest; - - vec = graph->preds[src]; - place = VEC_lower_bound (constraint_edge_t, vec, &newe, - constraint_edge_less); - if (place == VEC_length (constraint_edge_t, vec) - || VEC_index (constraint_edge_t, vec, place)->dest != dest) + if (graph->succs[node]) { - constraint_edge_t edge = new_constraint_edge (dest); - - VEC_safe_insert (constraint_edge_t, heap, graph->preds[src], - place, edge); - edge = new_constraint_edge (src); - - place = VEC_lower_bound (constraint_edge_t, graph->succs[dest], - edge, constraint_edge_less); - VEC_safe_insert (constraint_edge_t, heap, graph->succs[dest], - place, edge); - edge_added = true; - stats.num_edges++; - return true; + BITMAP_FREE (graph->succs[node]); + graph->succs[node] = NULL; } - else - return false; -} - - -/* Return the bitmap representing the weights of edge (SRC, DEST). */ - -static bitmap * -get_graph_weights (constraint_graph_t graph, unsigned int src, - unsigned int dest) -{ - constraint_edge_t edge; - VEC(constraint_edge_t,heap) *vec; - struct constraint_edge lookfor; - - lookfor.dest = dest; - - vec = graph->preds[src]; - edge = constraint_edge_vec_find (vec, lookfor); - gcc_assert (edge != NULL); - return &edge->weights; -} - -/* Allocate graph weight bitmap for the edges associated with SRC and - DEST in GRAPH. Both the pred and the succ edges share a single - bitmap, so we need to set both edges to that bitmap. */ - -static bitmap -allocate_graph_weights (constraint_graph_t graph, unsigned int src, - unsigned int dest) -{ - bitmap result; - constraint_edge_t edge; - VEC(constraint_edge_t,heap) *vec; - struct constraint_edge lookfor; - - result = BITMAP_ALLOC (&ptabitmap_obstack); - - /* Set the pred weight. */ - lookfor.dest = dest; - vec = graph->preds[src]; - edge = constraint_edge_vec_find (vec, lookfor); - gcc_assert (edge != NULL); - edge->weights = result; - - /* Set the succ weight. */ - lookfor.dest = src; - vec = graph->succs[dest]; - edge = constraint_edge_vec_find (vec, lookfor); - gcc_assert (edge != NULL); - edge->weights = result; - - return result; } +static bool edge_added = false; /* Merge GRAPH nodes FROM and TO into node TO. */ @@ -1022,144 +782,72 @@ static void merge_graph_nodes (constraint_graph_t graph, unsigned int to, unsigned int from) { - VEC(constraint_edge_t,heap) *succvec = graph->succs[from]; - VEC(constraint_edge_t,heap) *predvec = graph->preds[from]; - int i; - constraint_edge_t c; unsigned int j; bitmap_iterator bi; - /* Merge all the zero weighted predecessor edges. */ - if (graph->zero_weight_preds[from]) + /* Merge all the predecessor edges. */ + if (graph->preds[from]) { - if (!graph->zero_weight_preds[to]) - graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); + if (!graph->preds[to]) + graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack); - EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_preds[from], 0, j, bi) + EXECUTE_IF_SET_IN_BITMAP (graph->preds[from], 0, j, bi) { if (j != to) { - bitmap_clear_bit (graph->zero_weight_succs[j], from); - bitmap_set_bit (graph->zero_weight_succs[j], to); + bitmap_clear_bit (graph->succs[j], from); + bitmap_set_bit (graph->succs[j], to); } } - bitmap_ior_into (graph->zero_weight_preds[to], - graph->zero_weight_preds[from]); + bitmap_ior_into (graph->preds[to], + graph->preds[from]); } - /* Merge all the zero weighted successor edges. */ - if (graph->zero_weight_succs[from]) + /* Merge all the successor edges. */ + if (graph->succs[from]) { - if (!graph->zero_weight_succs[to]) - graph->zero_weight_succs[to] = BITMAP_ALLOC (&ptabitmap_obstack); - EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_succs[from], 0, j, bi) - { - bitmap_clear_bit (graph->zero_weight_preds[j], from); - bitmap_set_bit (graph->zero_weight_preds[j], to); - } - bitmap_ior_into (graph->zero_weight_succs[to], - graph->zero_weight_succs[from]); - } - - /* Merge all the nonzero weighted predecessor edges. */ - for (i = 0; VEC_iterate (constraint_edge_t, predvec, i, c); i++) - { - unsigned int d = c->dest; - bitmap temp; - bitmap *weights; - - if (c->dest == from) - d = to; - - add_graph_edge (graph, to, d); - - temp = *(get_graph_weights (graph, from, c->dest)); - if (temp) + if (!graph->succs[to]) + graph->succs[to] = BITMAP_ALLOC (&ptabitmap_obstack); + EXECUTE_IF_SET_IN_BITMAP (graph->succs[from], 0, j, bi) { - weights = get_graph_weights (graph, to, d); - if (!*weights) - *weights = allocate_graph_weights (graph, to, d); - - bitmap_ior_into (*weights, temp); + bitmap_clear_bit (graph->preds[j], from); + bitmap_set_bit (graph->preds[j], to); } - + bitmap_ior_into (graph->succs[to], + graph->succs[from]); } - - /* Merge all the nonzero weighted successor edges. */ - for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++) - { - unsigned int d = c->dest; - bitmap temp; - bitmap *weights; - - if (c->dest == from) - d = to; - add_graph_edge (graph, d, to); - - temp = *(get_graph_weights (graph, c->dest, from)); - if (temp) - { - weights = get_graph_weights (graph, d, to); - if (!*weights) - *weights = allocate_graph_weights (graph, d, to); - bitmap_ior_into (*weights, temp); - } - } clear_edges_for_node (graph, from); } -/* Add a graph edge to GRAPH, going from TO to FROM, with WEIGHT, if +/* Add a graph edge to GRAPH, going from TO to FROM if it doesn't exist in the graph already. Return false if the edge already existed, true otherwise. */ static bool -int_add_graph_edge (constraint_graph_t graph, unsigned int to, - unsigned int from, unsigned HOST_WIDE_INT weight) +add_graph_edge (constraint_graph_t graph, unsigned int to, + unsigned int from) { - if (to == from && weight == 0) + if (to == from) { return false; } else { bool r = false; - - if (weight == 0) - { - if (!graph->zero_weight_preds[to]) - graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); - if (!graph->zero_weight_succs[from]) - graph->zero_weight_succs[from] = BITMAP_ALLOC (&ptabitmap_obstack); - if (!bitmap_bit_p (graph->zero_weight_succs[from], to)) - { - edge_added = true; - r = true; - stats.num_edges++; - bitmap_set_bit (graph->zero_weight_preds[to], from); - bitmap_set_bit (graph->zero_weight_succs[from], to); - } - } - else + + if (!graph->preds[to]) + graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack); + if (!graph->succs[from]) + graph->succs[from] = BITMAP_ALLOC (&ptabitmap_obstack); + if (!bitmap_bit_p (graph->succs[from], to)) { - bitmap *weights; - - r = add_graph_edge (graph, to, from); - weights = get_graph_weights (graph, to, from); - - if (!*weights) - { - r = true; - *weights = allocate_graph_weights (graph, to, from); - bitmap_set_bit (*weights, weight); - } - else - { - r |= !bitmap_bit_p (*weights, weight); - bitmap_set_bit (*weights, weight); - } + edge_added = true; + r = true; + stats.num_edges++; + bitmap_set_bit (graph->preds[to], from); + bitmap_set_bit (graph->succs[from], to); } - return r; } } @@ -1171,28 +859,10 @@ static bool valid_graph_edge (constraint_graph_t graph, unsigned int src, unsigned int dest) { - struct constraint_edge lookfor; - lookfor.dest = src; - - return (graph->zero_weight_succs[dest] - && bitmap_bit_p (graph->zero_weight_succs[dest], src)) - || constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL; + return (graph->succs[dest] + && bitmap_bit_p (graph->succs[dest], src)); } -/* Return true if {DEST, SRC} is an existing weighted graph edge (IE has - a weight other than 0) in GRAPH. */ -static bool -valid_weighted_graph_edge (constraint_graph_t graph, unsigned int src, - unsigned int dest) -{ - struct constraint_edge lookfor; - lookfor.dest = src; - - return graph->preds[src] - && constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL; -} - - /* Build the constraint graph. */ static void @@ -1203,10 +873,8 @@ build_constraint_graph (void) graph = XNEW (struct constraint_graph); graph_size = VEC_length (varinfo_t, varmap) + 1; - graph->succs = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size); - graph->preds = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size); - graph->zero_weight_succs = XCNEWVEC (bitmap, graph_size); - graph->zero_weight_preds = XCNEWVEC (bitmap, graph_size); + graph->succs = XCNEWVEC (bitmap, graph_size); + graph->preds = XCNEWVEC (bitmap, graph_size); for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) { @@ -1234,12 +902,14 @@ build_constraint_graph (void) } else if (lhsvar > anything_id) { - /* Ignore 0 weighted self edges, as they can't possibly contribute + /* Ignore self edges, as they can't possibly contribute anything */ if (lhsvar != rhsvar || rhs.offset != 0 || lhs.offset != 0) { - /* x = y (simple) */ - int_add_graph_edge (graph, lhs.var, rhs.var, rhs.offset); + if (rhs.offset != 0 || lhs.offset != 0) + insert_into_complex (lhsvar, c); + else + add_graph_edge (graph, lhs.var, rhs.var); } } @@ -1291,7 +961,7 @@ scc_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n) si->visited_index[n] = si->current_index ++; /* Visit all the successors. */ - EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[n], 0, i, bi) + EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[n], 0, i, bi) { unsigned int w = i; if (!TEST_BIT (si->visited, w)) @@ -1340,16 +1010,10 @@ collapse_nodes (constraint_graph_t graph, unsigned int to, unsigned int from) if (valid_graph_edge (graph, to, to)) { - if (graph->zero_weight_preds[to]) - { - bitmap_clear_bit (graph->zero_weight_preds[to], to); - bitmap_clear_bit (graph->zero_weight_succs[to], to); - } - if (valid_weighted_graph_edge (graph, to, to)) + if (graph->preds[to]) { - bitmap weights = *(get_graph_weights (graph, to, to)); - if (!weights || bitmap_empty_p (weights)) - erase_graph_self_edge (graph, to); + bitmap_clear_bit (graph->preds[to], to); + bitmap_clear_bit (graph->succs[to], to); } } BITMAP_FREE (fromsol); @@ -1394,7 +1058,7 @@ process_unification_queue (constraint_graph_t graph, struct scc_info *si, Merge tmp into solution for rep, marking rep changed if this changed rep's solution. - Delete any 0 weighted self-edges we now have for rep. */ + Delete any self-edges we now have for rep. */ while (i != VEC_length (unsigned, si->unification_queue)) { unsigned int tounify = VEC_index (unsigned, si->unification_queue, i); @@ -1447,17 +1111,11 @@ process_unification_queue (constraint_graph_t graph, struct scc_info *si, if (valid_graph_edge (graph, n, n)) { - if (graph->zero_weight_succs[n]) + if (graph->succs[n]) { - if (graph->zero_weight_preds[n]) - bitmap_clear_bit (graph->zero_weight_preds[n], n); - bitmap_clear_bit (graph->zero_weight_succs[n], n); - } - if (valid_weighted_graph_edge (graph, n, n)) - { - bitmap weights = *(get_graph_weights (graph, n, n)); - if (!weights || bitmap_empty_p (weights)) - erase_graph_self_edge (graph, n); + if (graph->preds[n]) + bitmap_clear_bit (graph->preds[n], n); + bitmap_clear_bit (graph->succs[n], n); } } } @@ -1509,24 +1167,12 @@ static void topo_visit (constraint_graph_t graph, struct topo_info *ti, unsigned int n) { - VEC(constraint_edge_t,heap) *succs = graph->succs[n]; bitmap temp; bitmap_iterator bi; - constraint_edge_t c; - int i; unsigned int j; SET_BIT (ti->visited, n); - if (VEC_length (constraint_edge_t, succs) != 0) - { - temp = BITMAP_ALLOC (&iteration_obstack); - if (graph->zero_weight_succs[n]) - bitmap_ior_into (temp, graph->zero_weight_succs[n]); - for (i = 0; VEC_iterate (constraint_edge_t, succs, i, c); i++) - bitmap_set_bit (temp, c->dest); - } - else - temp = graph->zero_weight_succs[n]; + temp = graph->succs[n]; if (temp) EXECUTE_IF_SET_IN_BITMAP (temp, 0, j, bi) @@ -1640,7 +1286,7 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c, They don't have sets that can change. */ if (get_varinfo (t) ->is_special_var) flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); - else if (int_add_graph_edge (graph, lhs, t, 0)) + else if (add_graph_edge (graph, lhs, t)) flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); } else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) @@ -1664,7 +1310,7 @@ done: /* Process a constraint C that represents *x = y. */ static void -do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) +do_ds_constraint (constraint_t c, bitmap delta) { unsigned int rhs = get_varinfo (c->rhs.var)->node; unsigned HOST_WIDE_INT roff = c->rhs.offset; @@ -1710,27 +1356,26 @@ do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) varinfo_t v; unsigned int t; unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + loff; - + bitmap tmp; + v = first_vi_for_offset (get_varinfo (j), fieldoffset); if (!v) continue; t = v->node; - if (int_add_graph_edge (graph, t, rhs, roff)) + tmp = get_varinfo (t)->solution; + + if (set_union_with_increment (tmp, sol, roff)) { - bitmap tmp = get_varinfo (t)->solution; - if (set_union_with_increment (tmp, sol, roff)) + get_varinfo (t)->solution = tmp; + if (t == rhs) + sol = get_varinfo (rhs)->solution; + if (!TEST_BIT (changed, t)) { - get_varinfo (t)->solution = tmp; - if (t == rhs) - sol = get_varinfo (rhs)->solution; - if (!TEST_BIT (changed, t)) - { - SET_BIT (changed, t); - changed_count++; - } + SET_BIT (changed, t); + changed_count++; } } - } + } else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n"); } @@ -1752,15 +1397,40 @@ do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) else { /* *x = y */ - do_ds_constraint (graph, c, delta); + do_ds_constraint (c, delta); } } - else + else if (c->rhs.type == DEREF) { /* x = *y */ if (!(get_varinfo (c->lhs.var)->is_special_var)) do_sd_constraint (graph, c, delta); } + else + { + bitmap tmp; + bitmap solution; + bool flag = false; + unsigned int t; + + gcc_assert(c->rhs.type == SCALAR && c->lhs.type == SCALAR); + t = get_varinfo (c->rhs.var)->node; + solution = get_varinfo (t)->solution; + t = get_varinfo (c->lhs.var)->node; + tmp = get_varinfo (t)->solution; + + flag = set_union_with_increment (tmp, solution, c->rhs.offset); + + if (flag) + { + get_varinfo (t)->solution = tmp; + if (!TEST_BIT (changed, c->lhs.var)) + { + SET_BIT (changed, c->lhs.var); + changed_count++; + } + } + } } /* Initialize and return a new SCC info structure. */ @@ -1831,21 +1501,6 @@ compute_topo_order (constraint_graph_t graph, topo_visit (graph, ti, i); } -/* Return true if bitmap B is empty, or a bitmap other than bit 0 is set. */ - -static bool -bitmap_other_than_zero_bit_set (bitmap b) -{ - unsigned int i; - bitmap_iterator bi; - - if (bitmap_empty_p (b)) - return false; - EXECUTE_IF_SET_IN_BITMAP (b, 1, i, bi) - return true; - return false; -} - /* Perform offline variable substitution. This is a linear time way of identifying variables that must have @@ -1869,12 +1524,9 @@ perform_var_substitution (constraint_graph_t graph) while (VEC_length (unsigned, ti->topo_order) != 0) { unsigned int i = VEC_pop (unsigned, ti->topo_order); - unsigned int pred; varinfo_t vi = get_varinfo (i); bool okay_to_elim = false; unsigned int root = VEC_length (varinfo_t, varmap); - VEC(constraint_edge_t,heap) *predvec = graph->preds[i]; - constraint_edge_t ce = NULL; bitmap tmp; unsigned int k; bitmap_iterator bi; @@ -1885,7 +1537,7 @@ perform_var_substitution (constraint_graph_t graph) continue; /* See if all predecessors of I are ripe for elimination */ - EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[i], 0, k, bi) + EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[i], 0, k, bi) { unsigned int w; w = get_varinfo (k)->node; @@ -1921,55 +1573,6 @@ perform_var_substitution (constraint_graph_t graph) BITMAP_FREE (tmp); } - if (okay_to_elim) - for (pred = 0; - VEC_iterate (constraint_edge_t, predvec, pred, ce); - pred++) - { - bitmap weight; - unsigned int w; - weight = *(get_graph_weights (graph, i, ce->dest)); - - /* We can't eliminate variables that have nonzero weighted - edges between them. */ - if (weight && bitmap_other_than_zero_bit_set (weight)) - { - okay_to_elim = false; - break; - } - w = get_varinfo (ce->dest)->node; - - /* We can't eliminate the node if one of the predecessors is - part of a different strongly connected component. */ - if (!okay_to_elim) - { - root = w; - okay_to_elim = true; - } - else if (w != root) - { - okay_to_elim = false; - break; - } - - /* Theorem 4 in Rountev and Chandra: If i is a direct node, - then Solution(i) is a subset of Solution (w), where w is a - predecessor in the graph. - Corollary: If all predecessors of i have the same - points-to set, then i has that same points-to set as - those predecessors. */ - tmp = BITMAP_ALLOC (NULL); - bitmap_and_compl (tmp, get_varinfo (i)->solution, - get_varinfo (w)->solution); - if (!bitmap_empty_p (tmp)) - { - okay_to_elim = false; - BITMAP_FREE (tmp); - break; - } - BITMAP_FREE (tmp); - } - /* See if the root is different than the original node. If so, we've found an equivalence. */ if (root != get_varinfo (i)->node && okay_to_elim) @@ -2044,11 +1647,9 @@ solve_graph (constraint_graph_t graph) { unsigned int j; constraint_t c; - constraint_edge_t e = NULL; bitmap solution; bitmap_iterator bi; VEC(constraint_t,heap) *complex = get_varinfo (i)->complex; - VEC(constraint_edge_t,heap) *succs; bool solution_empty; RESET_BIT (changed, i); @@ -2073,14 +1674,14 @@ solve_graph (constraint_graph_t graph) if (!solution_empty) { /* Propagate solution to all successors. */ - succs = graph->succs[i]; - - EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[i], + EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i], 0, j, bi) { bitmap tmp = get_varinfo (j)->solution; bool flag = false; + gcc_assert (get_varinfo (j)->node == j); + flag = set_union_with_increment (tmp, solution, 0); if (flag) @@ -2093,35 +1694,13 @@ solve_graph (constraint_graph_t graph) } } } - for (j = 0; VEC_iterate (constraint_edge_t, succs, j, e); j++) - { - bitmap tmp = get_varinfo (e->dest)->solution; - bool flag = false; - unsigned int k; - bitmap weights = e->weights; - bitmap_iterator bi; - - gcc_assert (weights && !bitmap_empty_p (weights)); - EXECUTE_IF_SET_IN_BITMAP (weights, 0, k, bi) - flag |= set_union_with_increment (tmp, solution, k); - - if (flag) - { - get_varinfo (e->dest)->solution = tmp; - if (!TEST_BIT (changed, e->dest)) - { - SET_BIT (changed, e->dest); - changed_count++; - } - } - } } } } free_topo_info (ti); bitmap_obstack_release (&iteration_obstack); } - + sbitmap_free (changed); } @@ -4667,9 +4246,6 @@ init_alias_vars (void) sizeof (struct constraint), 30); variable_info_pool = create_alloc_pool ("Variable info pool", sizeof (struct variable_info), 30); - constraint_edge_pool = create_alloc_pool ("Constraint edges", - sizeof (struct constraint_edge), 30); - constraints = VEC_alloc (constraint_t, heap, 8); varmap = VEC_alloc (varinfo_t, heap, 8); id_for_tree = htab_create (10, tree_id_hash, tree_id_eq, free); @@ -4873,21 +4449,15 @@ delete_points_to_sets (void) if (i >= graph_size) break; - VEC_free (constraint_edge_t, heap, graph->succs[i]); - VEC_free (constraint_edge_t, heap, graph->preds[i]); VEC_free (constraint_t, heap, v->complex); } - free (graph->zero_weight_preds); - free (graph->zero_weight_succs); - free (graph->succs); free (graph->preds); + free (graph->succs); free (graph); VEC_free (varinfo_t, heap, varmap); free_alloc_pool (variable_info_pool); free_alloc_pool (constraint_pool); - free_alloc_pool (constraint_edge_pool); - have_alias_info = false; } |