X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg.c;h=72ff8ad5873142954e64c640b107c7a19617a4dc;hb=b9d45e08e23bcf058fa8f2d9e18dd78e8cccd044;hp=b99fb589fd9029f67dd687d6de7335e42bba6be2;hpb=d60e46b8da3aec0fec718da439811942360a6a20;p=libfirm diff --git a/ir/be/beifg.c b/ir/be/beifg.c index b99fb589f..72ff8ad58 100644 --- a/ir/be/beifg.c +++ b/ir/be/beifg.c @@ -37,6 +37,7 @@ #include "irnode_t.h" #include "irprintf.h" #include "irtools.h" +#include "irbitset.h" #include "beifg_t.h" #include "beifg_impl.h" #include "irphase.h" @@ -393,6 +394,7 @@ void be_ifg_check_sorted_to_file(const be_ifg_t *ifg, FILE *f) void be_ifg_check_performance(be_chordal_env_t *chordal_env) { +#ifdef WITH_LIBCORE int tests = BE_CH_PERFORMANCETEST_COUNT; coloring_t coloring; @@ -406,7 +408,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) lc_timer_t *timer = lc_timer_register("getTime","get Time of copy minimization using the ifg"); unsigned long elapsed_usec = 0; - if ((int) get_irg_estimated_node_cnt >= BE_CH_PERFORMANCETEST_MIN_NODES) + if (get_irg_estimated_node_cnt(chordal_env->irg) >= BE_CH_PERFORMANCETEST_MIN_NODES) { coloring_init(&coloring, chordal_env->irg, chordal_env->birg->main_env->arch_env); coloring_save(&coloring); @@ -456,7 +458,6 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) ir_printf("\nstd:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); - i=0; used_memory=0; elapsed_usec=0; @@ -502,7 +503,6 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) ir_printf("\nclique:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); - i=0; used_memory=0; elapsed_usec=0; @@ -548,7 +548,6 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) ir_printf("\nlist:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); - i=0; used_memory=0; elapsed_usec=0; @@ -600,6 +599,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } chordal_env->ifg = old_if; +#endif /* WITH_LIBCORE */ } void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump_dot_cb_t *cb, void *self) @@ -650,3 +650,58 @@ void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump fprintf(file, "}\n"); bitset_free(nodes); } + +static void int_comp_rec(const be_chordal_env_t *cenv, ir_node *n, bitset_t *seen) +{ + 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(cenv->ifg, nodes_it, n) { + stat->n_nodes += 1; + 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); +}