X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillbelady.c;h=7424d3da39498a840d207a4c6e570dd1b9d3463a;hb=5474a1c188c9d59eea2c915515980cd9cbab58d8;hp=dcf4eab96e0f8ef1d70a506243a2d9ca6251560e;hpb=ab182d4b9ed44239ab3ff1d08b2f8e14a3699ccf;p=libfirm diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index dcf4eab96..7424d3da3 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -22,7 +22,6 @@ * @brief Beladys spillalgorithm. * @author Daniel Grund, Matthias Braun * @date 20.09.2005 - * @version $Id$ */ #include "config.h" @@ -39,6 +38,8 @@ #include "ircons_t.h" #include "irprintf.h" #include "irnodeset.h" +#include "irtools.h" +#include "util.h" #include "beutil.h" #include "bearch.h" @@ -89,8 +90,6 @@ static workset_t *ws; /**< the main workset used while processing a block. */ static be_uses_t *uses; /**< env for the next-use magic */ static ir_node *instr; /**< current instruction */ -static unsigned instr_nr; /**< current instruction number - (relative to block start) */ static spill_env_t *senv; /**< see bespill.h */ static ir_node **blocklist; @@ -213,8 +212,8 @@ static const loc_t *workset_contains(const workset_t *ws, const ir_node *val) static int loc_compare(const void *a, const void *b) { - const loc_t *p = a; - const loc_t *q = b; + const loc_t *p = (const loc_t*)a; + const loc_t *q = (const loc_t*)b; return p->time - q->time; } @@ -255,7 +254,7 @@ static inline ir_node *workset_get_val(const workset_t *workset, unsigned idx) * @p v A variable to put the current value in * @p i An integer for internal use */ -#define workset_foreach(ws, v, i) \ +#define workset_foreach(ws, v, i) \ for (i=0; v=(i < ws->len) ? ws->vals[i].node : NULL, i < ws->len; ++i) typedef struct block_info_t { @@ -270,7 +269,7 @@ static block_info_t *new_block_info(void) static inline block_info_t *get_block_info(const ir_node *block) { - return get_irn_link(block); + return (block_info_t*)get_irn_link(block); } static inline void set_block_info(ir_node *block, block_info_t *info) @@ -281,8 +280,7 @@ static inline void set_block_info(ir_node *block, block_info_t *info) /** * @return The distance to the next use or 0 if irn has dont_spill flag set */ -static unsigned get_distance(ir_node *from, unsigned from_step, - const ir_node *def, int skip_from_uses) +static unsigned get_distance(ir_node *from, const ir_node *def, int skip_from_uses) { be_next_use_t use; unsigned costs; @@ -290,13 +288,13 @@ static unsigned get_distance(ir_node *from, unsigned from_step, assert(!arch_irn_is_ignore(def)); - use = be_get_next_use(uses, from, from_step, def, skip_from_uses); + use = be_get_next_use(uses, from, def, skip_from_uses); time = use.time; if (USES_IS_INFINITE(time)) return USES_INFINITY; /* We have to keep nonspillable nodes in the workingset */ - if (arch_irn_get_flags(skip_Proj_const(def)) & arch_irn_flags_dont_spill) + if (arch_get_irn_flags(skip_Proj_const(def)) & arch_irn_flags_dont_spill) return 0; /* give some bonus to rematerialisable nodes */ @@ -365,7 +363,7 @@ static void displace(workset_t *new_vals, int is_usage) /* calculate current next-use distance for live values */ for (i = 0; i < len; ++i) { ir_node *val = workset_get_val(ws, i); - unsigned dist = get_distance(instr, instr_nr, val, !is_usage); + unsigned dist = get_distance(instr, val, !is_usage); workset_set_time(ws, i, dist); } @@ -482,13 +480,13 @@ static loc_t to_take_or_not_to_take(ir_node* first, ir_node *node, } /* We have to keep nonspillable nodes in the workingset */ - if (arch_irn_get_flags(skip_Proj_const(node)) & arch_irn_flags_dont_spill) { + if (arch_get_irn_flags(skip_Proj_const(node)) & arch_irn_flags_dont_spill) { loc.time = 0; DB((dbg, DBG_START, " %+F taken (dontspill node)\n", node, loc.time)); return loc; } - next_use = be_get_next_use(uses, first, 0, node, 0); + next_use = be_get_next_use(uses, first, node, 0); if (USES_IS_INFINITE(next_use.time)) { /* the nodes marked as live in shouldn't be dead, so it must be a phi */ assert(is_Phi(node)); @@ -542,7 +540,7 @@ static void decide_start_workset(const ir_node *block) unsigned i; int in; unsigned ws_count; - int free_slots, free_pressure_slots; + int free_slots, free_pressure_slots; unsigned pressure; int arity; workset_t **pred_worksets; @@ -620,7 +618,7 @@ static void decide_start_workset(const ir_node *block) } pressure = be_get_loop_pressure(loop_ana, cls, loop); - assert(ARR_LEN(delayed) <= (signed)pressure); + assert(ARR_LEN(delayed) <= pressure); free_slots = n_regs - ARR_LEN(starters); free_pressure_slots = n_regs - (pressure - ARR_LEN(delayed)); free_slots = MIN(free_slots, free_pressure_slots); @@ -631,7 +629,8 @@ static void decide_start_workset(const ir_node *block) DB((dbg, DBG_START, "Loop pressure %d, taking %d delayed vals\n", pressure, free_slots)); if (free_slots > 0) { - int i; + size_t i; + qsort(delayed, ARR_LEN(delayed), sizeof(delayed[0]), loc_compare); for (i = 0; i < ARR_LEN(delayed) && free_slots > 0; ++i) { @@ -768,7 +767,7 @@ static void process_block(ir_node *block) /* no predecessor -> empty set */ workset_clear(ws); } else if (arity == 1) { - /* one predecessor, copy it's end workset */ + /* one predecessor, copy its end workset */ ir_node *pred_block = get_Block_cfgpred_block(block, 0); block_info_t *pred_info = get_block_info(pred_block); @@ -795,7 +794,6 @@ static void process_block(ir_node *block) /* process the block from start to end */ DB((dbg, DBG_WSETS, "Processing...\n")); - instr_nr = 0; /* TODO: this leaks (into the obstack)... */ new_vals = new_workset(); @@ -832,8 +830,6 @@ static void process_block(ir_node *block) workset_insert(new_vals, value, false); ); displace(new_vals, 0); - - instr_nr++; } /* Remember end-workset for this block */ @@ -950,13 +946,10 @@ static void be_spill_belady(ir_graph *irg, const arch_register_class_t *rcls) { int i; - be_liveness_assure_sets(be_assure_liveness(irg)); + be_assure_live_sets(irg); stat_ev_tim_push(); - /* construct control flow loop tree */ - if (! (get_irg_loopinfo_state(irg) & loopinfo_cf_consistent)) { - construct_cf_backedges(irg); - } + assure_loopinfo(irg); stat_ev_tim_pop("belady_time_backedges"); stat_ev_tim_push(); @@ -970,7 +963,7 @@ static void be_spill_belady(ir_graph *irg, const arch_register_class_t *rcls) obstack_init(&obst); cls = rcls; lv = be_get_irg_liveness(irg); - n_regs = cls->n_regs - be_put_ignore_regs(irg, cls, NULL); + n_regs = be_get_n_allocatable_regs(irg, cls); ws = new_workset(); uses = be_begin_uses(irg, lv); loop_ana = be_new_loop_pressure(irg, cls); @@ -1004,7 +997,7 @@ static void be_spill_belady(ir_graph *irg, const arch_register_class_t *rcls) obstack_free(&obst, NULL); } -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillbelady); +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillbelady) void be_init_spillbelady(void) { static be_spiller_t belady_spiller = {