* (also known as "heur3" :)
* Performs simple copy minimization.
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "config.h" /* HAVE_CONFIG_H */
#define DISABLE_STATEV
pqueue_t *chunks; /**< priority queue for chunks */
pset *chunkset; /**< set holding all chunks */
be_ifg_t *ifg; /**< the interference graph */
- const arch_env_t *aenv; /**< the arch environment */
copy_opt_t *co; /**< the copy opt object */
unsigned chunk_visited;
col_cost_t **single_cols;
* Creates a new affinity chunk
*/
static INLINE aff_chunk_t *new_aff_chunk(co_mst_env_t *env) {
- aff_chunk_t *c = xmalloc(sizeof(*c) + (env->n_regs - 1) * sizeof(c->color_affinity[0]));
+ aff_chunk_t *c = XMALLOCF(aff_chunk_t, color_affinity, env->n_regs);
c->n = NEW_ARR_F(const ir_node *, 0);
c->interfere = NEW_ARR_F(const ir_node *, 0);
c->weight = -1;
res->tmp_col = -1;
res->int_neighs = NULL;
res->int_aff_neigh = 0;
- res->col = arch_register_get_index(arch_get_irn_register(env->aenv, irn));
+ res->col = arch_register_get_index(arch_get_irn_register(irn));
res->init_col = res->col;
INIT_LIST_HEAD(&res->list);
res->adm_colors = bitset_obstack_alloc(phase_obst(ph), env->n_regs);
/* Exclude colors not assignable to the irn */
- req = arch_get_register_req(env->aenv, irn, -1);
+ req = arch_get_register_req(irn, -1);
if (arch_register_req_is(req, limited))
rbitset_copy_to_bitset(req->limited, res->adm_colors);
else
/* build list of interfering neighbours */
len = 0;
be_ifg_foreach_neighbour(env->ifg, nodes_it, irn, neigh) {
- if (! arch_irn_is(env->aenv, neigh, ignore)) {
+ if (!arch_irn_is(neigh, ignore)) {
obstack_ptr_grow(phase_obst(ph), neigh);
++len;
}
const ir_node *m = neigh->irn;
/* skip ignore nodes */
- if (arch_irn_is(env->aenv, m, ignore))
+ if (arch_irn_is(m, ignore))
continue;
w += node_contains(c->n, m) ? neigh->costs : 0;
int i;
/* skip ignore nodes */
- if (arch_irn_is(env->aenv, n, ignore))
+ if (arch_irn_is(n, ignore))
continue;
/* check if the affinity neighbour interfere */
affinity_node_t *an;
/* skip ignore nodes */
- if (arch_irn_is(env->aenv, n, ignore))
+ if (arch_irn_is(n, ignore))
continue;
n1 = get_co_mst_irn(env, n);
aff_edge_t edge;
/* skip ignore nodes */
- if (arch_irn_is(env->aenv, m, ignore))
+ if (arch_irn_is(m, ignore))
continue;
edge.src = n;
int w = 0;
neighb_t *neigh;
- if (arch_irn_is(env->aenv, irn, ignore))
+ if (arch_irn_is(irn, ignore))
continue;
if (an) {
affinity_node_t *an = get_affinity_info(env->co, irn);
neighb_t *neigh;
- if (arch_irn_is(env->aenv, irn, ignore))
+ if (arch_irn_is(irn, ignore))
continue;
assert(i <= ARR_LEN(chunk->n));
co_mst_irn_t *n2;
/* skip ignore nodes */
- if (arch_irn_is(env->aenv, m, ignore))
+ if (arch_irn_is(m, ignore))
continue;
n2 = get_co_mst_irn(env, m);
neigh = node->int_neighs[j];
/* skip ignore nodes */
- if (arch_irn_is(env->aenv, neigh, ignore))
+ if (arch_irn_is(neigh, ignore))
continue;
nn = get_co_mst_irn(env, neigh);
mst_env.co = co;
mst_env.ignore_regs = ignore_regs;
mst_env.ifg = co->cenv->ifg;
- mst_env.aenv = co->aenv;
mst_env.chunkset = pset_new_ptr(512);
mst_env.chunk_visited = 0;
mst_env.single_cols = phase_alloc(&mst_env.ph, sizeof(*mst_env.single_cols) * n_regs);
co_mst_irn_t *mirn;
const arch_register_t *reg;
- if (arch_irn_is(mst_env.aenv, irn, ignore))
+ if (arch_irn_is(irn, ignore))
continue;
mirn = get_co_mst_irn(&mst_env, irn);
continue;
reg = arch_register_for_index(co->cls, mirn->col);
- arch_set_irn_register(co->aenv, irn, reg);
+ arch_set_irn_register(irn, reg);
DB((dbg, LEVEL_1, "%+F set color from %d to %d\n", irn, mirn->init_col, mirn->col));
}