X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg.c;h=609bcea46c9ec8b7abcadbb4961e37b93aca28f4;hb=7ad86c1baab2fdceae2aa610bb584b30538cc5c6;hp=9afe66dd59567aa4af34cccf7a4cf02941968b78;hpb=3a655a311371c919abe77558a5ef6986fc4be093;p=libfirm diff --git a/ir/be/beifg.c b/ir/be/beifg.c index 9afe66dd5..609bcea46 100644 --- a/ir/be/beifg.c +++ b/ir/be/beifg.c @@ -22,7 +22,6 @@ * @brief Interface for interference graphs. * @author Sebastian Hack * @date 18.11.2005 - * @version $Id$ */ #include "config.h" @@ -37,9 +36,7 @@ #include "irnode_t.h" #include "irprintf.h" #include "irtools.h" -#include "irbitset.h" #include "beifg.h" -#include "irphase_t.h" #include "error.h" #include "xmalloc.h" @@ -56,14 +53,14 @@ void be_ifg_free(be_ifg_t *self) int be_ifg_connected(const be_ifg_t *ifg, const ir_node *a, const ir_node *b) { - return be_values_interfere(ifg->env->birg->lv, a, b); + be_lv_t *lv = be_get_irg_liveness(ifg->env->irg); + return be_values_interfere(lv, a, b); } static void nodes_walker(ir_node *bl, void *data) { - nodes_iter_t *it = data; + nodes_iter_t *it = (nodes_iter_t*)data; struct list_head *head = get_block_border_head(it->env, bl); - border_t *b; foreach_border_head(head, b) { if (b->is_def && b->is_real) { @@ -82,7 +79,7 @@ static void find_nodes(const be_ifg_t *ifg, nodes_iter_t *iter) irg_block_walk_graph(ifg->env->irg, nodes_walker, NULL, iter); obstack_ptr_grow(&iter->obst, NULL); - iter->nodes = obstack_finish(&iter->obst); + iter->nodes = (ir_node**)obstack_finish(&iter->obst); } static inline void node_break(nodes_iter_t *it, int force) @@ -123,13 +120,13 @@ void be_ifg_nodes_break(nodes_iter_t *iter) static void find_neighbour_walker(ir_node *block, void *data) { - neighbours_iter_t *it = data; + neighbours_iter_t *it = (neighbours_iter_t*)data; struct list_head *head = get_block_border_head(it->env, block); + be_lv_t *lv = be_get_irg_liveness(it->env->irg); - border_t *b; int has_started = 0; - if (!be_is_live_in(it->env->birg->lv, block, it->irn) && block != get_nodes_block(it->irn)) + if (!be_is_live_in(lv, block, it->irn) && block != get_nodes_block(it->irn)) return; foreach_border_head(head, b) { @@ -187,7 +184,7 @@ ir_node *be_ifg_neighbours_begin(const be_ifg_t *ifg, neighbours_iter_t *iter, const ir_node *irn) { find_neighbours(ifg, iter, irn); - return ir_nodeset_iterator_next(&iter->iter); + return get_next_neighbour(iter); } ir_node *be_ifg_neighbours_next(neighbours_iter_t *iter) @@ -209,7 +206,7 @@ static inline void free_clique_iter(cliques_iter_t *it) static void get_blocks_dom_order(ir_node *blk, void *env) { - cliques_iter_t *it = env; + cliques_iter_t *it = (cliques_iter_t*)env; obstack_ptr_grow(&it->ob, blk); } @@ -245,11 +242,9 @@ static inline int get_next_clique(cliques_iter_t *it) /* before shrinking the set, return the current maximal clique */ if (output_on_shrink) { int count = 0; - ir_node *irn; /* fill the output buffer */ - for (irn = pset_first(it->living); irn != NULL; - irn = pset_next(it->living)) { + foreach_pset(it->living, ir_node, irn) { it->buf[count++] = irn; } @@ -275,15 +270,13 @@ static inline int get_next_clique(cliques_iter_t *it) int be_ifg_cliques_begin(const be_ifg_t *ifg, cliques_iter_t *it, ir_node **buf) { - ir_node *start_bl = get_irg_start_block(ifg->env->irg); - obstack_init(&it->ob); - dom_tree_walk(start_bl, get_blocks_dom_order, NULL, it); + dom_tree_walk_irg(ifg->env->irg, get_blocks_dom_order, NULL, it); it->cenv = ifg->env; it->buf = buf; it->n_blocks = obstack_object_size(&it->ob) / sizeof(void *); - it->blocks = obstack_finish(&it->ob); + it->blocks = (ir_node**)obstack_finish(&it->ob); it->blk = 0; it->bor = NULL; it->living = pset_new_ptr(2 * arch_register_class_n_regs(it->cenv->cls)); @@ -319,90 +312,42 @@ be_ifg_t *be_create_ifg(const be_chordal_env_t *env) return ifg; } -void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump_dot_cb_t *cb, void *self) -{ - nodes_iter_t nodes_it; - neighbours_iter_t neigh_it; - bitset_t *nodes = bitset_malloc(get_irg_last_idx(irg)); - - ir_node *n, *m; - - fprintf(file, "graph G {\n\tgraph ["); - if (cb->graph_attr) - cb->graph_attr(file, self); - fprintf(file, "];\n"); - - if (cb->at_begin) - cb->at_begin(file, self); - - be_ifg_foreach_node(ifg, &nodes_it, n) { - if (cb->is_dump_node && cb->is_dump_node(self, n)) { - int idx = get_irn_idx(n); - bitset_set(nodes, idx); - fprintf(file, "\tnode ["); - if (cb->node_attr) - cb->node_attr(file, self, n); - fprintf(file, "]; n%d;\n", idx); - } - } - - /* Check, if all neighbours are indeed connected to the node. */ - be_ifg_foreach_node(ifg, &nodes_it, n) { - be_ifg_foreach_neighbour(ifg, &neigh_it, n, m) { - int n_idx = get_irn_idx(n); - int m_idx = get_irn_idx(m); - - if (n_idx < m_idx && bitset_is_set(nodes, n_idx) && bitset_is_set(nodes, m_idx)) { - fprintf(file, "\tn%d -- n%d [", n_idx, m_idx); - if (cb->edge_attr) - cb->edge_attr(file, self, n, m); - fprintf(file, "];\n"); - } - } - } - - if (cb->at_end) - cb->at_end(file, self); - - fprintf(file, "}\n"); - bitset_free(nodes); -} - static void int_comp_rec(be_ifg_t *ifg, ir_node *n, bitset_t *seen) { neighbours_iter_t neigh_it; - ir_node *m; be_ifg_foreach_neighbour(ifg, &neigh_it, n, m) { - if (bitset_contains_irn(seen, m)) + if (bitset_is_set(seen, get_irn_idx(m))) continue; - if (arch_get_register_req_out(m)->type & arch_register_req_type_ignore) + arch_register_req_t const *const req = arch_get_irn_register_req(m); + if (arch_register_req_is(req, ignore)) continue; - bitset_add_irn(seen, m); + bitset_set(seen, get_irn_idx(m)); int_comp_rec(ifg, m, seen); } } -static int int_component_stat(be_irg_t *birg, be_ifg_t *ifg) +static int int_component_stat(ir_graph *irg, be_ifg_t *ifg) { int n_comp = 0; nodes_iter_t nodes_it; - bitset_t *seen = bitset_irg_malloc(birg->irg); + bitset_t *seen = bitset_malloc(get_irg_last_idx(irg)); ir_node *n; be_ifg_foreach_node(ifg, &nodes_it, n) { - if (bitset_contains_irn(seen, n)) + if (bitset_is_set(seen, get_irn_idx(n))) continue; - if (arch_get_register_req_out(n)->type & arch_register_req_type_ignore) + arch_register_req_t const *const req = arch_get_irn_register_req(n); + if (arch_register_req_is(req, ignore)) continue; ++n_comp; - bitset_add_irn(seen, n); + bitset_set(seen, get_irn_idx(n)); int_comp_rec(ifg, n, seen); } @@ -410,23 +355,23 @@ static int int_component_stat(be_irg_t *birg, be_ifg_t *ifg) return n_comp; } -void be_ifg_stat(be_irg_t *birg, be_ifg_t *ifg, be_ifg_stat_t *stat) +void be_ifg_stat(ir_graph *irg, be_ifg_t *ifg, be_ifg_stat_t *stat) { nodes_iter_t nodes_it; neighbours_iter_t neigh_it; - bitset_t *nodes = bitset_irg_malloc(birg->irg); - ir_node *n, *m; + bitset_t *nodes = bitset_malloc(get_irg_last_idx(irg)); + ir_node *n; memset(stat, 0, sizeof(stat[0])); be_ifg_foreach_node(ifg, &nodes_it, n) { stat->n_nodes += 1; be_ifg_foreach_neighbour(ifg, &neigh_it, n, m) { - bitset_add_irn(nodes, n); - stat->n_edges += !bitset_contains_irn(nodes, m); + bitset_set(nodes, get_irn_idx(n)); + stat->n_edges += !bitset_is_set(nodes, get_irn_idx(m)); } } - stat->n_comps = int_component_stat(birg, ifg); + stat->n_comps = int_component_stat(irg, ifg); bitset_free(nodes); }