X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg.c;h=e42cc6ca69803adf0e2101c2e0181a8a248bfa04;hb=80a6158fdd766f42ee6c508a773bc114ff1b61f3;hp=89b9686ed057aeaf09141da5d10c3da8618f26dd;hpb=3bb66ebf95dbb5ddbdedb9065df378121c341717;p=libfirm diff --git a/ir/be/beifg.c b/ir/be/beifg.c index 89b9686ed..e42cc6ca6 100644 --- a/ir/be/beifg.c +++ b/ir/be/beifg.c @@ -6,13 +6,12 @@ * Copyright (C) 2005 Universitaet Karlsruhe * Released under the GPL */ - -#include - #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include + #ifdef HAVE_MALLOC_H #include #endif @@ -46,6 +45,7 @@ #include "becopystat.h" #include "becopyopt.h" +#include "beirg_t.h" /** Defines values for the ifg performance test */ #define BE_CH_PERFORMANCETEST_MIN_NODES (50) @@ -270,8 +270,8 @@ static int be_ifg_check_cmp_nodes(const void *a, const void *b) const ir_node *node_a = *(ir_node **)a; const ir_node *node_b = *(ir_node **)b; - int nr_a = node_a->node_nr; - int nr_b = node_b->node_nr; + long nr_a = get_irn_node_nr(node_a); + long nr_b = get_irn_node_nr(node_b); return QSORT_CMP(nr_a, nr_b); } @@ -651,22 +651,57 @@ void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump bitset_free(nodes); } -void be_ifg_stat(const be_ifg_t *ifg, ir_graph *irg, be_ifg_stat_t *stat) +static void int_comp_rec(const be_chordal_env_t *cenv, ir_node *n, bitset_t *seen) { - void *nodes_it = be_ifg_nodes_iter_alloca(ifg); - void *neigh_it = be_ifg_neighbours_iter_alloca(ifg); - bitset_t *nodes = bitset_irg_malloc(irg); + void *neigh_it = be_ifg_neighbours_iter_alloca(cenv->ifg); + ir_node *m; + + be_ifg_foreach_neighbour(cenv->ifg, neigh_it, n, m) { + if(!bitset_contains_irn(seen, m) && !arch_irn_is(cenv->birg->main_env->arch_env, m, ignore)) { + bitset_add_irn(seen, m); + int_comp_rec(cenv, m, seen); + } + } + +} + +static int int_component_stat(const be_chordal_env_t *cenv) +{ + int n_comp = 0; + void *nodes_it = be_ifg_nodes_iter_alloca(cenv->ifg); + bitset_t *seen = bitset_irg_malloc(cenv->irg); + + ir_node *n; + + be_ifg_foreach_node(cenv->ifg, nodes_it, n) { + if(!bitset_contains_irn(seen, n) && !arch_irn_is(cenv->birg->main_env->arch_env, n, ignore)) { + ++n_comp; + bitset_add_irn(seen, n); + int_comp_rec(cenv, n, seen); + } + } + + free(seen); + return n_comp; +} + +void be_ifg_stat(const be_chordal_env_t *cenv, be_ifg_stat_t *stat) +{ + void *nodes_it = be_ifg_nodes_iter_alloca(cenv->ifg); + void *neigh_it = be_ifg_neighbours_iter_alloca(cenv->ifg); + bitset_t *nodes = bitset_irg_malloc(cenv->irg); ir_node *n, *m; memset(stat, 0, sizeof(stat[0])); - be_ifg_foreach_node(ifg, nodes_it, n) { + be_ifg_foreach_node(cenv->ifg, nodes_it, n) { stat->n_nodes += 1; - be_ifg_foreach_neighbour(ifg, neigh_it, n, m) { + be_ifg_foreach_neighbour(cenv->ifg, neigh_it, n, m) { bitset_add_irn(nodes, n); stat->n_edges += !bitset_contains_irn(nodes, m); } } + stat->n_comps = int_component_stat(cenv); bitset_free(nodes); }