X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespill.c;h=85c051d17c23f3d84f8fdb6f8f863d49189016d4;hb=8dd1d4b07d2638ab224c6b044655facd6026dbd7;hp=86bbb178fefdeb6966836e28dbc98ddbd1e8b406;hpb=a2dc796648be8a0e8c85d6488e5ab5a790c218a9;p=libfirm diff --git a/ir/be/bespill.c b/ir/be/bespill.c index 86bbb178f..85c051d17 100644 --- a/ir/be/bespill.c +++ b/ir/be/bespill.c @@ -262,6 +262,26 @@ void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before, to_spill, before, allow_remat ? "" : " not")); } +ir_node *be_get_end_of_block_insertion_point(const ir_node *block) +{ + ir_node *last = sched_last(block); + + /* we might have projs and keepanys behind the jump... */ + while(is_Proj(last) || be_is_Keep(last)) { + last = sched_prev(last); + assert(!sched_is_end(last)); + } + + if(!is_cfop(last)) { + last = sched_next(last); + /* last node must be a cfop, only exception is the start block */ + assert(last == get_irg_start_block(get_irn_irg(block))); + } + + /* add the reload before the (cond-)jump */ + return last; +} + /** * Returns the point at which you can insert a node that should be executed * before block @p block when coming from pred @p pos. @@ -269,7 +289,7 @@ void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before, static ir_node *get_block_insertion_point(ir_node *block, int pos) { - ir_node *predblock, *last; + ir_node *predblock; /* simply add the reload to the beginning of the block if we only have 1 * predecessor. We don't need to check for phis as there can't be any in a @@ -281,22 +301,15 @@ ir_node *get_block_insertion_point(ir_node *block, int pos) /* We have to reload the value in pred-block */ predblock = get_Block_cfgpred_block(block, pos); - last = sched_last(predblock); - - /* we might have projs and keepanys behind the jump... */ - while(is_Proj(last) || be_is_Keep(last)) { - last = sched_prev(last); - assert(!sched_is_end(last)); - } - - if(!is_cfop(last)) { - last = sched_next(last); - /* last node must be a cfop, only exception is the start block */ - assert(last == get_irg_start_block(get_irn_irg(block))); - } + return be_get_end_of_block_insertion_point(predblock); +} - /* add the reload before the (cond-)jump */ - return last; +void be_add_reload_at_end(spill_env_t *env, ir_node *to_spill, const ir_node *block, + const arch_register_class_t *reload_cls, + int allow_remat) +{ + ir_node *before = be_get_end_of_block_insertion_point(block); + be_add_reload(env, to_spill, before, reload_cls, allow_remat); } void be_add_reload_on_edge(spill_env_t *env, ir_node *to_spill, ir_node *block, @@ -692,15 +705,6 @@ ir_node *do_remat(spill_env_t *env, ir_node *spilled, ir_node *reloader) DBG((dbg, LEVEL_1, "Insert remat %+F of %+F before reloader %+F\n", res, spilled, reloader)); -#ifdef SCHEDULE_PROJS - /* insert in schedule */ - sched_reset(res); - sched_add_before(reloader, res); -#ifdef FIRM_STATISTICS - if (! is_Proj(res)) - env->remat_count++; -#endif -#else if (! is_Proj(res)) { /* insert in schedule */ sched_reset(res); @@ -709,7 +713,6 @@ ir_node *do_remat(spill_env_t *env, ir_node *spilled, ir_node *reloader) env->remat_count++; #endif } -#endif /* SCHEDULE_PROJS */ return res; } @@ -813,7 +816,7 @@ void be_insert_spills_reloads(spill_env_t *env) remat_cost_delta = remat_cost - env->reload_cost; rld->remat_cost_delta = remat_cost_delta; - block = get_nodes_block(reloader); + block = is_Block(reloader) ? reloader : get_nodes_block(reloader); freq = get_block_execfreq(exec_freq, block); all_remat_costs += remat_cost_delta * freq; DBG((dbg, LEVEL_2, "\tremat costs delta before %+F: "