X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg.c;h=aa41dd30f1bbb79cf372b44cf0c95b80c8df9c73;hb=22b354ac921664032c93e5f0176fa668c95dfc60;hp=821809e213ca6e3d14e414d97f07468358cf9083;hpb=63bea6c02bc23bdd1f63f2847bc180bdaeecb461;p=libfirm diff --git a/ir/be/beifg.c b/ir/be/beifg.c index 821809e21..aa41dd30f 100644 --- a/ir/be/beifg.c +++ b/ir/be/beifg.c @@ -1,23 +1,38 @@ -/** - * @file beifg.c - * @date 18.11.2005 - * @author Sebastian Hack +/* + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. * - * Copyright (C) 2005 Universitaet Karlsruhe - * Released under the GPL + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief Interface for interference graphs. + * @author Sebastian Hack + * @date 18.11.2005 + * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include -#include -#include -#include +#include "lc_opts.h" +#include "lc_opts_enum.h" +#include "timing.h" #include "bitset.h" - #include "irgwalk.h" #include "irnode_t.h" #include "irprintf.h" @@ -25,15 +40,14 @@ #include "irbitset.h" #include "beifg_t.h" #include "beifg_impl.h" -#include "irphase.h" #include "irphase_t.h" -#include "bechordal.h" #include "error.h" #include "xmalloc.h" #include "becopystat.h" #include "becopyopt.h" -#include "beirg_t.h" +#include "beirg.h" +#include "bemodule.h" /** Defines values for the ifg performance test */ #define BE_CH_PERFORMANCETEST_MIN_NODES (50) @@ -42,9 +56,8 @@ typedef struct _coloring_t coloring_t; struct _coloring_t { - phase_t ph; - const arch_env_t *arch_env; - ir_graph *irg; + ir_phase ph; + ir_graph *irg; }; size_t (be_ifg_nodes_iter_size)(const be_ifg_t *ifg) @@ -62,16 +75,17 @@ size_t (be_ifg_cliques_iter_size)(const be_ifg_t *ifg) return ifg->impl->cliques_iter_size; } -static void *regs_irn_data_init(phase_t *ph, ir_node *irn, void *data) +static void *regs_irn_data_init(ir_phase *ph, const ir_node *irn, void *data) { - coloring_t *coloring = (coloring_t *) ph; - return (void *) arch_get_irn_register(coloring->arch_env, irn); + (void)ph; + (void)data; + + return (void*)arch_get_irn_register(irn); } -coloring_t *coloring_init(coloring_t *c, ir_graph *irg, const arch_env_t *aenv) +static coloring_t *coloring_init(coloring_t *c, ir_graph *irg) { - phase_init(&c->ph, "regs_map", irg, PHASE_DEFAULT_GROWTH, regs_irn_data_init); - c->arch_env = aenv; + phase_init(&c->ph, "regs_map", irg, PHASE_DEFAULT_GROWTH, regs_irn_data_init, NULL); c->irg = irg; return c; } @@ -87,15 +101,15 @@ static void restore_irn_color(ir_node *irn, void *c) coloring_t *coloring = c; const arch_register_t *reg = phase_get_irn_data(&coloring->ph, irn); if(reg) - arch_set_irn_register(coloring->arch_env, irn, reg); + arch_set_irn_register(irn, reg); } -void coloring_save(coloring_t *c) +static void coloring_save(coloring_t *c) { irg_walk_graph(c->irg, NULL, get_irn_color, c); } -void coloring_restore(coloring_t *c) +static void coloring_restore(coloring_t *c) { irg_walk_graph(c->irg, NULL, restore_irn_color, c); } @@ -166,7 +180,7 @@ int be_ifg_is_simplicial(const be_ifg_t *ifg, const ir_node *irn) int degree = be_ifg_degree(ifg, irn); void *iter = be_ifg_neighbours_iter_alloca(ifg); - ir_node **neighbours = xmalloc(degree * sizeof(neighbours[0])); + ir_node **neighbours = XMALLOCN(ir_node*, degree); ir_node *curr; int i, j; @@ -243,8 +257,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; - long nr_a = get_irn_node_nr(node_a); - long nr_b = get_irn_node_nr(node_b); + long nr_a = get_irn_idx(node_a); + long nr_b = get_irn_idx(node_b); return QSORT_CMP(nr_a, nr_b); } @@ -258,7 +272,7 @@ void be_ifg_check_sorted(const be_ifg_t *ifg) const int node_count = be_ifg_check_get_node_count(ifg); int i = 0; - ir_node **all_nodes = xmalloc(node_count * sizeof(all_nodes[0])); + ir_node **all_nodes = XMALLOCN(ir_node*, node_count); be_ifg_foreach_node(ifg, iter1, n) { @@ -276,7 +290,7 @@ void be_ifg_check_sorted(const be_ifg_t *ifg) for (i = 0; i < node_count; i++) { - ir_node **neighbours = xmalloc(node_count * sizeof(neighbours[0])); + ir_node **neighbours = XMALLOCN(ir_node*, node_count); int j = 0; int k = 0; int degree = 0; @@ -316,7 +330,7 @@ void be_ifg_check_sorted_to_file(const be_ifg_t *ifg, FILE *f) const int node_count = be_ifg_check_get_node_count(ifg); int i = 0; - ir_node **all_nodes = xmalloc(node_count * sizeof(all_nodes[0])); + ir_node **all_nodes = XMALLOCN(ir_node*, node_count); be_ifg_foreach_node(ifg, iter1, n) { @@ -334,7 +348,7 @@ void be_ifg_check_sorted_to_file(const be_ifg_t *ifg, FILE *f) for (i = 0; i < node_count; i++) { - ir_node **neighbours = xmalloc(node_count * sizeof(neighbours[0])); + ir_node **neighbours = XMALLOCN(ir_node*, node_count); int j = 0; int k = 0; int degree = 0; @@ -377,30 +391,30 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) copy_opt_t *co; be_ifg_t *old_if = chordal_env->ifg; - lc_timer_t *timer = lc_timer_register("getTime","get Time of copy minimization using the ifg"); + ir_timer_t *timer = ir_timer_new(); unsigned long elapsed_usec = 0; 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_init(&coloring, chordal_env->irg); coloring_save(&coloring); - lc_timer_reset(timer); + ir_timer_reset(timer); for (i = 0; iifg = be_ifg_std_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); - used_memory = lc_get_heap_used_bytes() - used_memory; + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -409,13 +423,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -424,7 +438,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; @@ -435,17 +449,17 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) for (i = 0; iifg = be_ifg_clique_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); - used_memory = lc_get_heap_used_bytes() - used_memory; + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -454,13 +468,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -469,7 +483,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; @@ -480,17 +494,17 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) for (i = 0; iifg = be_ifg_list_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); - used_memory = lc_get_heap_used_bytes() - used_memory; + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -499,13 +513,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -514,7 +528,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; @@ -525,17 +539,17 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) for (i = 0; iifg = be_ifg_pointer_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); - used_memory = lc_get_heap_used_bytes() - used_memory; + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -544,13 +558,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -559,7 +573,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; @@ -571,6 +585,8 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } chordal_env->ifg = old_if; + + ir_timer_free(timer); } void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump_dot_cb_t *cb, void *self) @@ -622,16 +638,20 @@ void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump bitset_free(nodes); } -static void int_comp_rec(be_irg_t *birg, be_ifg_t *ifg, ir_node *n, bitset_t *seen) +static void int_comp_rec(be_ifg_t *ifg, ir_node *n, bitset_t *seen) { void *neigh_it = be_ifg_neighbours_iter_alloca(ifg); ir_node *m; be_ifg_foreach_neighbour(ifg, neigh_it, n, m) { - if(!bitset_contains_irn(seen, m) && !arch_irn_is(birg->main_env->arch_env, m, ignore)) { - bitset_add_irn(seen, m); - int_comp_rec(birg, ifg, m, seen); - } + if (bitset_contains_irn(seen, m)) + continue; + + if (arch_get_register_req_out(m)->type & arch_register_req_type_ignore) + continue; + + bitset_add_irn(seen, m); + int_comp_rec(ifg, m, seen); } } @@ -645,11 +665,15 @@ static int int_component_stat(be_irg_t *birg, be_ifg_t *ifg) ir_node *n; be_ifg_foreach_node(ifg, nodes_it, n) { - if (! bitset_contains_irn(seen, n) && ! arch_irn_is(birg->main_env->arch_env, n, ignore)) { - ++n_comp; - bitset_add_irn(seen, n); - int_comp_rec(birg, ifg, n, seen); - } + if (bitset_contains_irn(seen, n)) + continue; + + if (arch_get_register_req_out(n)->type & arch_register_req_type_ignore) + continue; + + ++n_comp; + bitset_add_irn(seen, n); + int_comp_rec(ifg, n, seen); } free(seen); @@ -704,7 +728,7 @@ static lc_opt_enum_int_var_t ifg_flavor_var = { static const lc_opt_table_entry_t be_ifg_options[] = { LC_OPT_ENT_ENUM_PTR ("ifg", "interference graph flavour", &ifg_flavor_var), - { NULL } + LC_OPT_LAST }; void be_init_ifg(void)