co2_irn_t *touched_next;
col_t tmp_col;
col_t orig_col;
- unsigned const *adm_cache;
+ unsigned const *admissible;
unsigned fixed : 1;
unsigned tmp_fixed : 1;
struct list_head changed_list;
ci->irn = node;
ci->aff = NULL;
+ arch_register_req_t const *const req = arch_get_irn_register_req(node);
+ ci->admissible = arch_register_req_is(req, limited) ? req->limited : env->allocatable_regs->data;
+
ir_nodemap_insert(&env->map, node, ci);
}
return ci;
return ci->fixed || ci->tmp_fixed;
}
-static inline unsigned const *admissible_colors(co2_t *const env, co2_irn_t *const ci)
-{
- if (ci->adm_cache == NULL) {
- arch_register_req_t const *const req = arch_get_irn_register_req(ci->irn);
- ci->adm_cache = arch_register_req_is(req, limited)
- ? req->limited : env->allocatable_regs->data;
- }
-
- return ci->adm_cache;
-}
-
-static inline int is_color_admissible(co2_t *env, co2_irn_t *ci, col_t col)
+static inline int is_color_admissible(co2_irn_t *const ci, col_t const col)
{
- unsigned const *const bs = admissible_colors(env, ci);
+ unsigned const *const bs = ci->admissible;
return rbitset_is_set(bs, col);
}
be_ifg_neighbours_break(&it);
/* Set the costs to infinity for each color which is not allowed at this node. */
- unsigned const *const admissible = admissible_colors(env, ci);
+ unsigned const *const admissible = ci->admissible;
rbitset_foreach_clear(admissible, n_regs, elm) {
col_costs[elm].costs = INT_MAX;
}
}
(void) ci;
- assert(is_color_admissible(env, ci, col));
+ assert(is_color_admissible(ci, col));
seq[col].col = 0;
seq[0].col = col;
seq[0].costs = 0;
goto end;
}
- if (!color_is_fix(env, irn) && is_color_admissible(env, ci, tgt_col)) {
+ if (!color_is_fix(env, irn) && is_color_admissible(ci, tgt_col)) {
int n_regs = env->co->cls->n_regs;
col_cost_pair_t *seq = ALLOCAN(col_cost_pair_t, n_regs);
neighbours_iter_t it;
{
- unsigned const *const bs = admissible_colors(env, &ci->inh);
+ unsigned const *const bs = ci->inh.admissible;
rbitset_foreach_clear(bs, n_regs, elm)
badness[elm] = ci->costs;
}
be_ifg_foreach_neighbour(env->co->cenv->ifg, &it, ci->inh.irn, irn) {
co2_irn_t *ni = get_co2_irn(env, irn);
- unsigned const *const bs = admissible_colors(env, ni);
+ unsigned const *const bs = ni->admissible;
if (rbitset_popcount(bs, n_regs) == 1) {
size_t const c = rbitset_next_max(bs, 0, n_regs, true);
badness[c] += ci->costs;
int badness = ci->color_badness[i];
seq[i].col = i;
- seq[i].costs = is_color_admissible(env, &ci->inh, i) ? badness : INT_MAX;
+ seq[i].costs = is_color_admissible(&ci->inh, i) ? badness : INT_MAX;
min_badness = MIN(min_badness, badness);
}
/* If we are not the root and the parent's color is allowed for this node give it top prio. */
- if (!is_root && is_color_admissible(env, &ci->inh, parent_col))
+ if (!is_root && is_color_admissible(&ci->inh, parent_col))
seq[parent_col].costs = min_badness - 1;
/* Sort the colors. The will be processed in that ordering. */
/* add the node's cost to the total costs of the cloud. */
ci->costs = costs;
cloud->costs += costs;
- cloud->freedom += rbitset_popcount(admissible_colors(env, &ci->inh), env->n_regs);
+ cloud->freedom += rbitset_popcount(ci->inh.admissible, env->n_regs);
cloud->n_memb += 1;
/* If this is the heaviest node in the cloud, set it as the cloud's master. */