X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillbelady.c;h=028d17b4d70c1649163cdb05638f5e75499b501a;hb=8535fe8732b0acf822be252812a7158ce5b8134a;hp=dac32ee8d43a3cf495f4de7722f95cd14e4efff7;hpb=1a684155e6dadb818cb3afebe4ae80e2c33a2a48;p=libfirm diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index dac32ee8d..028d17b4d 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -342,18 +342,28 @@ static void displace(belady_env_t *env, workset_t *new_vals, int is_usage) { static void belady(ir_node *block, void *env); -static loc_t to_take_or_not_to_take(belady_env_t *env, ir_node* first, ir_node *node, ir_node *block, ir_loop *loop) { +/** Decides whether a specific node should be in the start workset or not + * + * @param env belady environment + * @param first + * @param node the node to test + * @param block the block of the node + * @param loop the loop of the node + */ +static loc_t to_take_or_not_to_take(belady_env_t *env, ir_node* first, + ir_node *node, ir_node *block, + ir_loop *loop) +{ be_next_use_t next_use; loc_t loc; loc.time = USES_INFINITY; + loc.irn = node; if (!arch_irn_consider_in_reg_alloc(env->arch, env->cls, node)) { loc.time = USES_INFINITY; return loc; } - loc.irn = node; - /* We have to keep nonspillable nodes in the workingset */ if(arch_irn_get_flags(env->arch, node) & arch_irn_flags_dont_spill) { loc.time = 0; @@ -364,9 +374,9 @@ static loc_t to_take_or_not_to_take(belady_env_t *env, ir_node* first, ir_node * next_use = be_get_next_use(env->uses, first, 0, 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)); loc.time = USES_INFINITY; DBG((dbg, DBG_START, " %+F not taken (dead)\n", node)); - assert(is_Phi(node)); return loc; } @@ -441,8 +451,9 @@ static void compute_live_ins(ir_node *block, void *data) { } pressure = be_get_loop_pressure(env->loop_ana, env->cls, loop); + assert(ARR_LEN(delayed) <= pressure); free_slots = env->n_regs - ARR_LEN(starters); - free_pressure_slots = env->n_regs - pressure; + free_pressure_slots = env->n_regs - (pressure - ARR_LEN(delayed)); free_slots = MIN(free_slots, free_pressure_slots); /* append nodes delayed due to loop structure until start set is full */ for (i = 0; i < ARR_LEN(delayed) && i < free_slots; ++i) { @@ -659,9 +670,7 @@ void be_spill_belady_spill_env(be_irg_t *birg, const arch_register_class_t *cls, belady_env_t env; ir_graph *irg = be_get_birg_irg(birg); - FIRM_DBG_REGISTER(dbg, "firm.be.spill.belady"); - //firm_dbg_set_mask(dbg, DBG_SPILL); - + be_invalidate_liveness(birg); be_assure_liveness(birg); /* construct control flow loop tree */ if(! (get_irg_loopinfo_state(irg) & loopinfo_cf_consistent)) { @@ -709,6 +718,7 @@ void be_init_spillbelady(void) }; be_register_spiller("belady", &belady_spiller); + FIRM_DBG_REGISTER(dbg, "firm.be.spill.belady"); } BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillbelady);