#define get_co2_irn(co2, irn) ((co2_irn_t *) phase_get_or_set_irn_data(&co2->ph, irn))
#define get_co2_cloud_irn(co2, irn) ((co2_cloud_irn_t *) phase_get_or_set_irn_data(&co2->ph, irn))
-static void *co2_irn_init(ir_phase *ph, const ir_node *irn, void *data)
+static void *co2_irn_init(ir_phase *ph, const ir_node *irn)
{
co2_t *env = (co2_t *) ph;
affinity_node_t *a = get_affinity_info(env->co, irn);
size_t size = a ? sizeof(co2_cloud_irn_t) : sizeof(co2_irn_t);
- co2_irn_t *ci = data ? data : phase_alloc(ph, size);
+ co2_irn_t *ci = phase_alloc(ph, size);
memset(ci, 0, size);
INIT_LIST_HEAD(&ci->changed_list);
return QSORT_CMP(c, d);
}
-int cmp_edges(const void *a, const void *b)
+static int cmp_edges(const void *a, const void *b)
{
const edge_t *p = a;
const edge_t *q = b;
unsigned n_constr = 0;
unsigned i;
- n_constr = rbitset_popcnt(req->limited, n_regs);
+ n_constr = rbitset_popcount(req->limited, n_regs);
for (i = 0; i < n_regs; ++i) {
if (rbitset_is_set(req->limited, i)) {
col_costs[i].costs = add_saturated(col_costs[i].costs, costs / n_constr);
bitset_t *forb = bitset_alloca(n_regs);
affinity_node_t *a = ci->aff;
- bitset_pos_t elm;
+ unsigned elm;
const ir_node *pos;
- void *it;
+ neighbours_iter_t it;
int i;
/* Put all forbidden colors into the aux bitset. */
}
}
- it = be_ifg_neighbours_iter_alloca(ifg);
- be_ifg_foreach_neighbour(ifg, it, irn, pos) {
+ be_ifg_foreach_neighbour(ifg, &it, irn, pos) {
col_t col = get_col(env, pos);
if (color_is_fix(env, pos)) {
col_costs[col].costs = INT_MAX;
col_costs[col].costs = add_saturated(col_costs[col].costs, 8 * be_ifg_degree(ifg, pos));
}
}
- be_ifg_neighbours_break(ifg, it);
+ be_ifg_neighbours_break(&it);
/* Set the costs to infinity for each color which is not allowed at this node. */
bitset_foreach(forb, elm) {
struct list_head changed;
const ir_node *n;
- void *it;
+ neighbours_iter_t it;
DBG((env->dbg, LEVEL_3, "\t\t%2{firm:indent}trying color %d(%d) on %+F\n", depth, tgt_col, costs, irn));
INIT_LIST_HEAD(&changed);
list_add(&ci->changed_list, &changed);
- it = be_ifg_neighbours_iter_alloca(ifg);
- be_ifg_foreach_neighbour(ifg, it, irn, n) {
+ be_ifg_foreach_neighbour(ifg, &it, irn, n) {
/* try to re-color the neighbor if it has the target color. */
if (get_col(env, n) == tgt_col) {
break;
}
}
- be_ifg_neighbours_break(ifg, it);
+ be_ifg_neighbours_break(&it);
/*
We managed to assign the target color to all neighbors, so from the perspective
be_ifg_t *ifg = env->co->cenv->ifg;
bitset_t *bs = bitset_alloca(n_regs);
- bitset_pos_t elm;
+ unsigned elm;
const ir_node *irn;
- void *it;
+ neighbours_iter_t it;
admissible_colors(env, &ci->inh, bs);
bitset_flip_all(bs);
badness[elm] = ci->costs;
/* Use constrained/fixed interfering neighbors to influence the color badness */
- it = be_ifg_neighbours_iter_alloca(ifg);
- be_ifg_foreach_neighbour(ifg, it, ir->irn, irn) {
+ be_ifg_foreach_neighbour(ifg, &it, ir->irn, irn) {
co2_irn_t *ni = get_co2_irn(env, irn);
admissible_colors(env, ni, bs);
- if (bitset_popcnt(bs) == 1) {
- bitset_pos_t c = bitset_next_set(bs, 0);
+ if (bitset_popcount(bs) == 1) {
+ unsigned c = bitset_next_set(bs, 0);
badness[c] += ci->costs;
}
badness[c] += ci->costs;
}
}
- be_ifg_neighbours_break(ifg, it);
+ be_ifg_neighbours_break(&it);
}
/**
ci->costs = costs;
cloud->costs += costs;
cloud->n_constr += is_constrained(env, &ci->inh);
- cloud->freedom += bitset_popcnt(get_adm(env, &ci->inh));
+ cloud->freedom += bitset_popcount(get_adm(env, &ci->inh));
cloud->max_degree = MAX(cloud->max_degree, ci->inh.aff->degree);
cloud->n_memb++;
co2_t env;
FILE *f;
- phase_init(&env.ph, "co2", co->cenv->birg->irg, PHASE_DEFAULT_GROWTH, co2_irn_init, NULL);
+ phase_init(&env.ph, co->cenv->irg, co2_irn_init);
env.touched = NULL;
env.visited = 0;
env.co = co;
env.n_regs = co->cls->n_regs;
env.ignore_regs = bitset_alloca(co->cls->n_regs);
- be_put_ignore_regs(co->cenv->birg, co->cls, env.ignore_regs);
+ be_put_ignore_regs(co->cenv->irg, co->cls, env.ignore_regs);
FIRM_DBG_REGISTER(env.dbg, "firm.be.co2");
INIT_LIST_HEAD(&env.cloud_head);
}
writeback_colors(&env);
- phase_free(&env.ph);
+ phase_deinit(&env.ph);
return 0;
}
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyheur2);
void be_init_copyheur2(void)
{
lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
lc_opt_add_table(co2_grp, options);
be_register_copyopt("heur2", ©heur);
}
-
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyheur2);