X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyheur3.c;h=62320ae2b86053bc662eff5c196e6a7527b44b36;hb=b9d45e08e23bcf058fa8f2d9e18dd78e8cccd044;hp=b36b9d5e88ed50b868003f9b6f4e59b6a0c194f2;hpb=f7c9890c7f7c869f7da0e521487772ad99b18aaf;p=libfirm diff --git a/ir/be/becopyheur3.c b/ir/be/becopyheur3.c index b36b9d5e8..62320ae2b 100644 --- a/ir/be/becopyheur3.c +++ b/ir/be/becopyheur3.c @@ -79,15 +79,17 @@ static void set_admissible_regs(be_java_coal_t *coal, copy_opt_t *co, ir_node *i unsigned i; arch_register_req_t req; unsigned n_regs = co->cls->n_regs; - unsigned idx = get_irn_idx(irn); + // ir_printf("%+F\n", irn); arch_get_register_req(co->aenv, &req, irn, BE_OUT_POS(0)); if(arch_register_req_is(&req, limited)) { bitset_t *adm = bitset_alloca(n_regs); req.limited(req.limited_env, adm); for(i = 0; i < n_regs; ++i) - if(!bitset_is_set(adm, i) && col_map[i] >= 0) + if(!bitset_is_set(adm, i) && col_map[i] >= 0) { + // printf("\tforbidding color: %d\n", i); be_java_coal_forbid_color(coal, t_idx, col_map[i]); + } } } @@ -99,6 +101,7 @@ int co_solve_heuristic_java(copy_opt_t *co) bitset_t *nodes = bitset_malloc(get_irg_last_idx(co->irg)); unsigned n_regs = co->cenv->cls->n_regs; + char dbg[256]; unsigned i, j, curr_idx; int *col_map; int *inv_col_map; @@ -108,20 +111,18 @@ int co_solve_heuristic_java(copy_opt_t *co) be_java_coal_t *coal; ir_node *n, *m; - int max_idx = 0; col_map = alloca(n_regs * sizeof(col_map[0])); inv_col_map = alloca(n_regs * sizeof(inv_col_map[0])); - memset(inv_col_map, 0, sizeof(inv_col_map[0]) * n_regs); + memset(inv_col_map, -1, sizeof(inv_col_map[0]) * n_regs); for(i = 0, j = 0; i < n_regs; ++i) { const arch_register_t *reg = &co->cls->regs[i]; - col_map[i] = i; - inv_col_map[i] = i; + col_map[i] = -1; if(!arch_register_type_is(reg, ignore)) { - //col_map[i] = j; - //inv_col_map[j] = i; + col_map[i] = j; + inv_col_map[j] = i; ++j; } } @@ -157,6 +158,8 @@ int co_solve_heuristic_java(copy_opt_t *co) if(bitset_is_set(nodes, n_idx)) { affinity_node_t *an = get_affinity_info(co, n); + ir_snprintf(dbg, sizeof(dbg), "%+F", n); + be_java_coal_set_debug(coal, t_idx, dbg); be_java_coal_set_color(coal, t_idx, col_map[arch_get_irn_register(co->aenv, n)->index]); set_admissible_regs(coal, co, n, t_idx, col_map); be_ifg_foreach_neighbour(ifg, neigh_it, n, m) { @@ -195,7 +198,10 @@ int co_solve_heuristic_java(copy_opt_t *co) if(bitset_is_set(nodes, idx)) { unsigned t_idx = node_map[idx]; unsigned col = inv_col_map[be_java_coal_get_color(coal, t_idx)]; - const arch_register_t *reg = &co->cls->regs[col]; + const arch_register_t *reg; + + assert(col < n_regs); + reg = &co->cls->regs[col]; arch_set_irn_register(co->aenv, n, reg); } }