X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyopt.c;h=cba1f255958bebfb272267ec230fa1ad8ec00b69;hb=945c6c2ceebef5e41c0486c31f49d2319cacb3da;hp=9b78136e6232c4bc9775dfdb29e9fa060779893a;hpb=793165ad171bd938143e0d466efafebde94b348a;p=libfirm diff --git a/ir/be/becopyopt.c b/ir/be/becopyopt.c index 9b78136e6..cba1f2559 100644 --- a/ir/be/becopyopt.c +++ b/ir/be/becopyopt.c @@ -1,20 +1,6 @@ /* - * 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. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. + * Copyright (C) 2012 University of Karlsruhe. */ /** @@ -181,17 +167,6 @@ void be_init_copynone(void) #undef QUICK_AND_DIRTY_HACK -static int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const ir_node *b) -{ - if (env->ifg) - return be_ifg_connected(env->ifg, a, b); - else { - be_lv_t *lv = be_get_irg_liveness(env->irg); - return be_values_interfere(lv, a, b); - } -} - - /****************************************************************************** _____ _ / ____| | | @@ -207,31 +182,18 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) copy_opt_t *new_copy_opt(be_chordal_env_t *chordal_env, cost_fct_t get_costs) { - const char *s1, *s2, *s3; - size_t len; - copy_opt_t *co; - FIRM_DBG_REGISTER(dbg, "ir.be.copyopt"); - co = XMALLOCZ(copy_opt_t); + copy_opt_t *const co = XMALLOCZ(copy_opt_t); co->cenv = chordal_env; co->irg = chordal_env->irg; co->cls = chordal_env->cls; co->get_costs = get_costs; - - s1 = get_irp_name(); - s2 = get_entity_name(get_irg_entity(co->irg)); - s3 = chordal_env->cls->name; - len = strlen(s1) + strlen(s2) + strlen(s3) + 5; - co->name = XMALLOCN(char, len); - snprintf(co->name, len, "%s__%s__%s", s1, s2, s3); - return co; } void free_copy_opt(copy_opt_t *co) { - xfree(co->name); free(co); } @@ -323,9 +285,8 @@ static int co_get_costs_all_one(const ir_node *root, int pos) * Determines a maximum weighted independent set with respect to * the interference and conflict edges of all nodes in a qnode. */ -static int ou_max_ind_set_costs(unit_t *ou) +static int ou_max_ind_set_costs(unit_t *const ou, be_lv_t const *const lv) { - be_chordal_env_t *chordal_env = ou->co->cenv; ir_node **safe, **unsafe; int i, o, safe_count, safe_costs, unsafe_count, *unsafe_costs; bitset_t *curr; @@ -346,7 +307,7 @@ static int ou_max_ind_set_costs(unit_t *ou) for (o=1; onode_count; ++o) { if (i==o) continue; - if (nodes_interfere(chordal_env, ou->nodes[i], ou->nodes[o])) { + if (be_values_interfere(lv, ou->nodes[i], ou->nodes[o])) { unsafe_costs[unsafe_count] = ou->costs[i]; unsafe[unsafe_count] = ou->nodes[i]; ++unsafe_count; @@ -369,7 +330,7 @@ static int ou_max_ind_set_costs(unit_t *ou) bitset_set(best, i); /* check if it is a stable set */ for (o=bitset_next_set(best, 0); o!=-1 && oco = co; unit->node_count = 1; INIT_LIST_HEAD(&unit->queue); + be_lv_t *const lv = be_get_irg_liveness(co->irg); /* Phi with some/all of its arguments */ if (is_Reg_Phi(irn)) { int i, arity; @@ -445,7 +406,7 @@ static void co_collect_units(ir_node *irn, void *env) assert(arch_get_irn_reg_class(arg) == co->cls && "Argument not in same register class."); if (arg == irn) continue; - if (nodes_interfere(co->cenv, irn, arg)) { + if (be_values_interfere(lv, irn, arg)) { unit->inevitable_costs += co->get_costs(irn, i); continue; } @@ -479,7 +440,7 @@ static void co_collect_units(ir_node *irn, void *env) unit->costs = XREALLOC(unit->costs, int, unit->node_count); } else if (is_Perm_Proj(irn)) { /* Proj of a perm with corresponding arg */ - assert(!nodes_interfere(co->cenv, irn, get_Perm_src(irn))); + assert(!be_values_interfere(lv, irn, get_Perm_src(irn))); unit->nodes = XMALLOCN(ir_node*, 2); unit->costs = XMALLOCN(int, 2); unit->node_count = 2; @@ -497,7 +458,7 @@ static void co_collect_units(ir_node *irn, void *env) ir_node *o = get_irn_n(skip_Proj(irn), i); if (arch_irn_is_ignore(o)) continue; - if (nodes_interfere(co->cenv, irn, o)) + if (be_values_interfere(lv, irn, o)) continue; ++count; } @@ -515,7 +476,7 @@ static void co_collect_units(ir_node *irn, void *env) if (other & (1U << i)) { ir_node *o = get_irn_n(skip_Proj(irn), i); if (!arch_irn_is_ignore(o) && - !nodes_interfere(co->cenv, irn, o)) { + !be_values_interfere(lv, irn, o)) { unit->nodes[k] = o; unit->costs[k] = co->get_costs(irn, -1); ++k; @@ -539,7 +500,7 @@ static void co_collect_units(ir_node *irn, void *env) } /* Determine the minimal costs this unit will cause: min_nodes_costs */ - unit->min_nodes_costs += unit->all_nodes_costs - ou_max_ind_set_costs(unit); + unit->min_nodes_costs += unit->all_nodes_costs - ou_max_ind_set_costs(unit, lv); /* Insert the new ou according to its sort_key */ tmp = &co->units; while (tmp->next != &co->units && list_entry_units(tmp->next)->sort_key > unit->sort_key) @@ -713,6 +674,7 @@ void co_complete_stats(const copy_opt_t *co, co_complete_stats_t *stat) memset(stat, 0, sizeof(stat[0])); /* count affinity edges. */ + be_lv_t *const lv = be_get_irg_liveness(co->irg); co_gs_foreach_aff_node(co, an) { stat->aff_nodes += 1; bitset_set(seen, get_irn_idx(an->irn)); @@ -726,7 +688,7 @@ void co_complete_stats(const copy_opt_t *co, co_complete_stats_t *stat) stat->unsatisfied_edges += 1; } - if (nodes_interfere(co->cenv, an->irn, neigh->irn)) { + if (be_values_interfere(lv, an->irn, neigh->irn)) { stat->aff_int += 1; stat->inevit_costs += neigh->costs; } @@ -765,7 +727,6 @@ static void add_edge(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) int allocnew = 1; new_node.irn = n1; - new_node.degree = 0; new_node.neighbours = NULL; node = set_insert(affinity_node_t, co->nodes, &new_node, sizeof(new_node), hash_irn(new_node.irn)); @@ -783,7 +744,6 @@ static void add_edge(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) nbr->next = node->neighbours; node->neighbours = nbr; - node->degree++; } /* now nbr points to n1's neighbour-entry of n2 */ @@ -792,7 +752,8 @@ static void add_edge(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) static inline void add_edges(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) { - if (! be_ifg_connected(co->cenv->ifg, n1, n2)) { + be_lv_t *const lv = be_get_irg_liveness(co->irg); + if (!be_values_interfere(lv, n1, n2)) { add_edge(co, n1, n2, costs); add_edge(co, n2, n1, costs); } @@ -857,10 +818,7 @@ int co_gs_is_optimizable(copy_opt_t *co, ir_node *irn) new_node.irn = irn; n = set_find(affinity_node_t, co->nodes, &new_node, sizeof(new_node), hash_irn(new_node.irn)); - if (n) { - return (n->degree > 0); - } else - return 0; + return n && n->neighbours; } static int co_dump_appel_disjoint_constraints(const copy_opt_t *co, ir_node *a, ir_node *b) @@ -899,8 +857,6 @@ static void co_dump_appel_graph(const copy_opt_t *co, FILE *f) ir_graph *irg = co->irg; be_irg_t *birg = be_birg_from_irg(irg); - ir_node *irn; - nodes_iter_t it; neighbours_iter_t nit; int n, n_regs; unsigned i; @@ -921,7 +877,7 @@ static void co_dump_appel_graph(const copy_opt_t *co, FILE *f) */ n = n_regs; - be_ifg_foreach_node(ifg, &it, irn) { + be_ifg_foreach_node(ifg, irn) { if (arch_irn_is_ignore(irn)) continue; node_map[get_irn_idx(irn)] = n++; @@ -929,14 +885,13 @@ static void co_dump_appel_graph(const copy_opt_t *co, FILE *f) fprintf(f, "%d %d\n", n, n_regs); - be_ifg_foreach_node(ifg, &it, irn) { + be_ifg_foreach_node(ifg, irn) { arch_register_req_t const *const req = arch_get_irn_register_req(irn); if (arch_register_req_is(req, ignore)) continue; int idx = node_map[get_irn_idx(irn)]; affinity_node_t *a = get_affinity_info(co, irn); - ir_node *adj; if (arch_register_req_is(req, limited)) { for (i = 0; i < co->cls->n_regs; ++i) {