X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbepbqpcoloring.c;h=36dad0ae903c66a84143eb065d3181768ff91be0;hb=49bec3440763fcbac6bee60638cc8d699b12af11;hp=97f136938099ed461357d9cac3aa65e7ed3568fc;hpb=87ad0010a3fac4bdcf430da4636c7868d4920852;p=libfirm diff --git a/ir/be/bepbqpcoloring.c b/ir/be/bepbqpcoloring.c index 97f136938..36dad0ae9 100644 --- a/ir/be/bepbqpcoloring.c +++ b/ir/be/bepbqpcoloring.c @@ -22,7 +22,6 @@ * @brief PBQP based register allocation. * @author Thomas Bersch * @date 27.11.2009 - * @version $Id: bechordal.c 26750 2009-11-27 09:37:43Z bersch $ */ /* miscellaneous includes */ @@ -36,9 +35,9 @@ #include "iredges_t.h" #include "irprintf.h" #include "irgwalk.h" +#include "irtools.h" #include "time.h" - -/* libfirm/ir/adt includes */ +#include "execfreq_t.h" #include "bipartite.h" /* libfirm/ir/be includes */ @@ -91,6 +90,7 @@ typedef struct be_pbqp_alloc_env_t { plist_t *rpeo; unsigned *restr_nodes; unsigned *ife_edge_num; + ir_execfreq_int_factors execfreq_factors; be_chordal_env_t *env; } be_pbqp_alloc_env_t; @@ -155,7 +155,10 @@ static void create_pbqp_node(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *irn) /* set costs depending on register constrains */ unsigned idx; for (idx = 0; idx < colors_n; idx++) { - if (!bitset_is_set(allocatable_regs, idx) || !arch_reg_out_is_allocatable(irn, arch_register_for_index(cls, idx))) { + const arch_register_req_t *req = arch_get_irn_register_req(irn); + const arch_register_t *reg = arch_register_for_index(cls, idx); + if (!bitset_is_set(allocatable_regs, idx) + || !arch_reg_is_allocatable(req, reg)) { /* constrained */ vector_set(costs_vector, idx, INF_COSTS); cntConstrains++; @@ -216,10 +219,9 @@ static void insert_afe_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_no if (get_edge(pbqp, get_irn_idx(src_node), get_irn_idx(trg_node)) == NULL) { if (use_exec_freq) { /* get exec_freq for copy_block */ - ir_node *root_bl = get_nodes_block(src_node); - ir_node *copy_bl = is_Phi(src_node) ? get_Block_cfgpred_block(root_bl, pos) : root_bl; - ir_exec_freq *exec_freq = be_get_irg_exec_freq(pbqp_alloc_env->irg); - unsigned long res = get_block_execfreq_ulong(exec_freq, copy_bl); + ir_node *root_bl = get_nodes_block(src_node); + ir_node *copy_bl = is_Phi(src_node) ? get_Block_cfgpred_block(root_bl, pos) : root_bl; + int res = get_block_execfreq_int(&pbqp_alloc_env->execfreq_factors, copy_bl); /* create afe-matrix */ unsigned row, col; @@ -259,7 +261,7 @@ static void create_affinity_edges(ir_node *irn, void *env) { be_pbqp_alloc_env_t *pbqp_alloc_env = (be_pbqp_alloc_env_t*)env; const arch_register_class_t *cls = pbqp_alloc_env->cls; - const arch_register_req_t *req = arch_get_register_req_out(irn); + const arch_register_req_t *req = arch_get_irn_register_req(irn); unsigned pos; unsigned max; @@ -317,7 +319,6 @@ static void create_pbqp_coloring_instance(ir_node *block, void *data) pbqp_t *pbqp_inst = pbqp_alloc_env->pbqp_inst; plist_t *temp_list = plist_new(); plist_element_t *el; - ir_node *irn; ir_nodeset_t live_nodes; #if USE_BIPARTIT_MATCHING int *assignment = ALLOCAN(int, cls->n_regs); @@ -339,11 +340,7 @@ static void create_pbqp_coloring_instance(ir_node *block, void *data) /* create pbqp nodes, interference edges and reverse perfect elimination order */ sched_foreach_reverse(block, irn) { - ir_node *live; - ir_nodeset_iterator_t iter; - if (get_irn_mode(irn) == mode_T) { - const ir_edge_t *edge; foreach_out_edge(irn, edge) { ir_node *proj = get_edge_src_irn(edge); if (!arch_irn_consider_in_reg_alloc(cls, proj)) @@ -408,7 +405,6 @@ static void create_pbqp_coloring_instance(ir_node *block, void *data) bipartite_t *bp = bipartite_new(cls->n_regs, cls->n_regs); /* add all proj after a perm to clique */ - const ir_edge_t *edge; foreach_out_edge(irn, edge) { ir_node *proj = get_edge_src_irn(edge); @@ -508,9 +504,7 @@ static void create_pbqp_coloring_instance(ir_node *block, void *data) #else /* order nodes for perfect elimination order */ if (get_irn_mode(irn) == mode_T) { - bool allHaveIFEdges = true; - const ir_edge_t *edge; - + bool allHaveIFEdges = true; foreach_out_edge(irn, edge) { ir_node *proj = get_edge_src_irn(edge); if (!arch_irn_consider_in_reg_alloc(cls, proj)) @@ -621,7 +615,11 @@ static void be_pbqp_coloring(be_chordal_env_t *env) be_pbqp_alloc_env_t pbqp_alloc_env; unsigned col; unsigned row; - + pbqp_matrix_t *ife_matrix; + num solution; +#if KAPS_DUMP + FILE *file_before; +#endif #if TIMER ir_timer_t *t_ra_pbqp_alloc_create = ir_timer_new(); ir_timer_t *t_ra_pbqp_alloc_solve = ir_timer_new(); @@ -629,9 +627,8 @@ static void be_pbqp_coloring(be_chordal_env_t *env) printf("#### ----- === Allocating registers of %s (%s) ===\n", cls->name, get_entity_name(get_irg_entity(irg))); #endif - lv = be_assure_liveness(irg); - be_liveness_assure_sets(lv); - be_liveness_assure_chk(lv); + be_assure_live_sets(irg); + lv = be_get_irg_liveness(irg); /* insert perms */ assure_doms(irg); @@ -644,6 +641,7 @@ static void be_pbqp_coloring(be_chordal_env_t *env) dump_ir_graph(irg, buf); } + ir_calculate_execfreq_int_factors(&pbqp_alloc_env.execfreq_factors, irg); /* initialize pbqp allocation data structure */ pbqp_alloc_env.pbqp_inst = alloc_pbqp(get_irg_last_idx(irg)); /* initialize pbqp instance */ @@ -659,7 +657,7 @@ static void be_pbqp_coloring(be_chordal_env_t *env) /* create costs matrix template for interference edges */ - pbqp_matrix_t *ife_matrix = pbqp_matrix_alloc(pbqp_alloc_env.pbqp_inst, colors_n, colors_n); + ife_matrix = pbqp_matrix_alloc(pbqp_alloc_env.pbqp_inst, colors_n, colors_n); /* set costs */ for (row = 0, col = 0; row < colors_n; row++, col++) pbqp_matrix_set(ife_matrix, row, col, INF_COSTS); @@ -709,18 +707,20 @@ static void be_pbqp_coloring(be_chordal_env_t *env) #if KAPS_DUMP // dump graph before solving pbqp - FILE *file_before = my_open(env, "", "-pbqp_coloring.html"); + file_before = my_open(env, "", "-pbqp_coloring.html"); set_dumpfile(pbqp_alloc_env.pbqp_inst, file_before); #endif - /* print out reverse perfect eleminiation order */ + /* print out reverse perfect elimination order */ #if PRINT_RPEO - plist_element_t *elements; - foreach_plist(pbqp_alloc_env.rpeo, elements) { - pbqp_node *node = elements->data; - printf(" %d(%lu);", node->index, get_idx_irn(irg, node->index)->node_nr); + { + plist_element_t *elements; + foreach_plist(pbqp_alloc_env.rpeo, elements) { + pbqp_node_t *node = elements->data; + printf(" %d(%ld);", node->index, get_idx_irn(irg, node->index)->node_nr); + } + printf("\n"); } - printf("\n"); #endif /* solve pbqp instance */ @@ -738,7 +738,7 @@ static void be_pbqp_coloring(be_chordal_env_t *env) #endif - num solution = get_solution(pbqp_alloc_env.pbqp_inst); + solution = get_solution(pbqp_alloc_env.pbqp_inst); if (solution == INF_COSTS) panic("No PBQP solution found"); @@ -779,7 +779,7 @@ static void be_pbqp_coloring(be_chordal_env_t *env) /** * Initializes this module. */ -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_pbqp_coloring); +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_pbqp_coloring) void be_init_pbqp_coloring(void) { lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");