X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbechordal.c;h=24126a1be6990ff6c89b1cfa9aa51d88d3c33d15;hb=5474a1c188c9d59eea2c915515980cd9cbab58d8;hp=26f76f1f50cf85393eab5cec75637a82a79665a3;hpb=6c3146b96bc65d9de18f3f2b59faf33b8b9935d6;p=libfirm diff --git a/ir/be/bechordal.c b/ir/be/bechordal.c index 26f76f1f5..24126a1be 100644 --- a/ir/be/bechordal.c +++ b/ir/be/bechordal.c @@ -22,7 +22,6 @@ * @brief Chordal register allocation. * @author Sebastian Hack * @date 08.12.2004 - * @version $Id$ */ #include "config.h" @@ -44,7 +43,6 @@ #include "irdump.h" #include "irdom.h" #include "irtools.h" -#include "irbitset.h" #include "debug.h" #include "iredges.h" @@ -69,8 +67,6 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) -#define NO_COLOR (-1) - #define DUMP_INTERVALS typedef struct be_chordal_alloc_env_t { @@ -171,7 +167,7 @@ static void pair_up_operands(const be_chordal_alloc_env_t *alloc_env, be_insn_t } static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, - ir_node *irn, int *silent) + ir_node *irn) { int n_regs; bitset_t *bs; @@ -180,7 +176,7 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, int *assignment; pmap *partners; int i, n_alloc; - unsigned col; + size_t col; const ir_edge_t *edge; ir_node *perm = NULL; //int match_res, cost; @@ -188,7 +184,6 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, void *base = obstack_base(env->obst); be_insn_t *insn = chordal_scan_insn(env, irn); ir_node *res = insn->next_insn; - int be_silent = *silent; bipartite_t *bp; if (insn->pre_colored) { @@ -197,19 +192,6 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, pset_insert_ptr(alloc_env->pre_colored, insn->ops[i].carrier); } - /* - * If the current node is a barrier toggle the silent flag. - * If we are in the start block, we are ought to be silent at the beginning, - * so the toggling activates the constraint handling but skips the barrier. - * If we are in the end block we handle the in requirements of the barrier - * and set the rest to silent. - */ - if (be_is_Barrier(irn)) - *silent = !*silent; - - if (be_silent) - goto end; - /* * Perms inserted before the constraint handling phase are considered to be * correctly precolored. These Perms arise during the ABI handling phase. @@ -342,7 +324,6 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, assert(assignment[i] >= 0 && "there must have been a register assigned (node not register pressure faithful?)"); reg = arch_register_for_index(env->cls, assignment[i]); - assert(! (reg->type & arch_register_type_ignore)); irn = alloc_nodes[i]; if (irn != NULL) { @@ -351,7 +332,7 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", irn, reg->name)); } - irn = pmap_get(partners, alloc_nodes[i]); + irn = (ir_node*)pmap_get(partners, alloc_nodes[i]); if (irn != NULL) { arch_set_irn_register(irn, reg); (void) pset_hinsert_ptr(alloc_env->pre_colored, irn); @@ -408,27 +389,17 @@ end: */ static void constraints(ir_node *bl, void *data) { - /* - * Start silent in the start block. - * The silence remains until the first barrier is seen. - * Each other block is begun loud. - */ - int silent = bl == get_irg_start_block(get_irn_irg(bl)); - be_chordal_alloc_env_t *env = data; + be_chordal_alloc_env_t *env = (be_chordal_alloc_env_t*)data; ir_node *irn; - /* - * If the block is the start block search the barrier and - * start handling constraints from there. - */ for (irn = sched_first(bl); !sched_is_end(irn);) { - irn = handle_constraints(env, irn, &silent); + irn = handle_constraints(env, irn); } } static void assign(ir_node *block, void *env_ptr) { - be_chordal_alloc_env_t *alloc_env = env_ptr; + be_chordal_alloc_env_t *alloc_env = (be_chordal_alloc_env_t*)env_ptr; be_chordal_env_t *env = alloc_env->chordal_env; bitset_t *live = alloc_env->live; bitset_t *colors = alloc_env->colors; @@ -492,7 +463,7 @@ static void assign(ir_node *block, void *env_ptr) */ if (b->is_def && !be_is_live_in(lv, block, irn)) { const arch_register_t *reg; - int col = NO_COLOR; + int col; if (ignore || pset_find_ptr(alloc_env->pre_colored, irn)) { reg = arch_get_irn_register(irn); @@ -502,7 +473,6 @@ static void assign(ir_node *block, void *env_ptr) col = get_next_free_reg(alloc_env, colors); reg = arch_register_for_index(env->cls, col); assert(arch_get_irn_register(irn) == NULL && "This node must not have been assigned a register yet"); - assert(!arch_register_type_is(reg, ignore) && "Must not assign ignore register"); } bitset_set(colors, col); @@ -520,11 +490,6 @@ static void assign(ir_node *block, void *env_ptr) assert(reg && "Register must have been assigned"); col = arch_register_get_index(reg); -#ifndef NDEBUG - if (!arch_register_type_is(reg, ignore)) { - assert(bitset_is_set(live, nr) && "Cannot have a non live use"); - } -#endif bitset_clear(colors, col); bitset_clear(live, nr); @@ -536,16 +501,12 @@ void be_ra_chordal_color(be_chordal_env_t *chordal_env) { be_chordal_alloc_env_t env; char buf[256]; - be_lv_t *lv; const arch_register_class_t *cls = chordal_env->cls; - int colors_n = arch_register_class_n_regs(cls); - ir_graph *irg = chordal_env->irg; - - lv = be_assure_liveness(irg); - be_liveness_assure_sets(lv); - be_liveness_assure_chk(lv); + int colors_n = arch_register_class_n_regs(cls); + ir_graph *irg = chordal_env->irg; + be_assure_live_sets(irg); assure_doms(irg); env.chordal_env = chordal_env; @@ -587,7 +548,7 @@ void be_ra_chordal_color(be_chordal_env_t *chordal_env) del_pset(env.pre_colored); } -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_chordal); +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_chordal) void be_init_chordal(void) { static be_ra_chordal_coloring_t coloring = {