X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyopt.c;h=584da53204051c891735d0b19390c1d3eddeeb5a;hb=9276447aec4972df060349e162f583c4898dfec8;hp=8464541ab8db977674d55f8c4f1bb0fea1f612ec;hpb=e3e49a5a39a35aebe4a693cdde6beb78a5c21b90;p=libfirm diff --git a/ir/be/becopyopt.c b/ir/be/becopyopt.c index 8464541ab..584da5320 100644 --- a/ir/be/becopyopt.c +++ b/ir/be/becopyopt.c @@ -38,6 +38,7 @@ #include "debug.h" #include "pmap.h" #include "raw_bitset.h" +#include "irnode.h" #include "irgraph.h" #include "irgwalk.h" #include "irprog.h" @@ -53,6 +54,7 @@ #include "benode_t.h" #include "beutil.h" #include "beifg_t.h" +#include "beintlive_t.h" #include "becopyopt_t.h" #include "becopystat.h" #include "belive_t.h" @@ -63,7 +65,6 @@ #include "bestatevent.h" #include "beirg_t.h" #include "error.h" -#include "bera.h" #include #include @@ -175,7 +176,7 @@ static int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const if (env->ifg) return be_ifg_connected(env->ifg, a, b); else - return values_interfere(env->birg->lv, a, b); + return values_interfere(env->birg, a, b); } @@ -240,39 +241,6 @@ int co_is_optimizable_root(const copy_opt_t *co, ir_node *irn) { return 0; } -int co_is_optimizable_arg(const copy_opt_t *co, ir_node *irn) { - const ir_edge_t *edge; - const arch_register_t *reg; - - assert(0 && "Is buggy and obsolete. Do not use"); - - if (arch_irn_is(co->aenv, irn, ignore)) - return 0; - - reg = arch_get_irn_register(co->aenv, irn); - if (arch_register_type_is(reg, ignore)) - return 0; - - foreach_out_edge(irn, edge) { - ir_node *n = edge->src; - - if (!nodes_interfere(co->cenv, irn, n) || irn == n) { - const arch_register_req_t *req; - req = arch_get_register_req(co->aenv, n, -1); - - if(is_Reg_Phi(n) || - is_Perm(co->aenv, n) || - (arch_register_req_is(req, should_be_same))) { - ir_node *other = get_irn_n(irn, req->other_same); - if(other == irn) - return 1; - } - } - } - - return 0; -} - int co_get_costs_loop_depth(const copy_opt_t *co, ir_node *root, ir_node* arg, int pos) { int cost = 0; ir_loop *loop; @@ -486,7 +454,7 @@ static void co_collect_units(ir_node *irn, void *env) { /* Src == Tgt of a 2-addr-code instruction */ if (is_2addr_code(req)) { - ir_node *other = get_irn_n(irn, req->other_same); + ir_node *other = get_irn_n(skip_Proj(irn), req->other_same); if (!arch_irn_is(co->aenv, other, ignore) && !nodes_interfere(co->cenv, irn, other)) { unit->nodes = xmalloc(2 * sizeof(*unit->nodes)); @@ -740,15 +708,14 @@ static int compare_affinity_node_t(const void *k1, const void *k2, size_t size) static void add_edge(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) { affinity_node_t new_node, *node; - neighb_t new_nbr, *nbr; - int allocnew; + neighb_t *nbr; + int allocnew = 1; new_node.irn = n1; new_node.degree = 0; new_node.neighbours = NULL; node = set_insert(co->nodes, &new_node, sizeof(new_node), nodeset_hash(new_node.irn)); - allocnew = 1; for (nbr = node->neighbours; nbr; nbr = nbr->next) if (nbr->irn == n2) { allocnew = 0; @@ -757,11 +724,11 @@ static void add_edge(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) { /* if we did not find n2 in n1's neighbourhood insert it */ if (allocnew) { - obstack_grow(&co->obst, &new_nbr, sizeof(new_nbr)); - nbr = obstack_finish(&co->obst); + nbr = obstack_alloc(&co->obst, sizeof(*nbr)); nbr->irn = n2; nbr->costs = 0; nbr->next = node->neighbours; + node->neighbours = nbr; node->degree++; } @@ -807,8 +774,8 @@ static void build_graph_walker(ir_node *irn, void *env) { const arch_register_req_t *req = arch_get_register_req(co->aenv, irn, -1); if (is_2addr_code(req)) { - ir_node *other = get_irn_n(irn, req->other_same); - if(!arch_irn_is(co->aenv, other, ignore)) + ir_node *other = get_irn_n(skip_Proj(irn), req->other_same); + if (! arch_irn_is(co->aenv, other, ignore)) add_edges(co, irn, other, co->get_costs(co, irn, other, 0)); } }