X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillmorgan.c;h=16f9e60801e55df0caad62686fa0b6997d2a7b3c;hb=80a6158fdd766f42ee6c508a773bc114ff1b61f3;hp=6165cfe22d493afef9a84356f82ddc6c9ed8e339;hpb=1199f8c8f58637df942d3112f74b83193941251d;p=libfirm diff --git a/ir/be/bespillmorgan.c b/ir/be/bespillmorgan.c index 6165cfe22..16f9e6080 100644 --- a/ir/be/bespillmorgan.c +++ b/ir/be/bespillmorgan.c @@ -152,10 +152,10 @@ static INLINE int consider_for_spilling(const arch_env_t *env, const arch_regist } /** - * Determine edges going out of a loop (= edges that go to a block that is not inside - * the loop or one of its subloops) + * Determine edges going out of a loop (= edges that go to a block that is not + * inside the loop or one of its subloops) */ -static INLINE void construct_loop_edges(ir_node* block, void* data) { +static INLINE void construct_loop_edges(ir_node *block, void *data) { morgan_env_t *env = data; int n_cfgpreds = get_Block_n_cfgpreds(block); int i; @@ -240,6 +240,7 @@ static void show_nodebitset(ir_graph* irg, const bitset_t* bitset) { static INLINE void init_livethrough_unuseds(block_attr_t *attr, morgan_env_t *env) { const ir_node *block; int i; + be_lv_t *lv = env->cenv->birg->lv; if(attr->livethrough_unused != NULL) return; @@ -249,8 +250,8 @@ static INLINE void init_livethrough_unuseds(block_attr_t *attr, morgan_env_t *en attr->livethrough_unused = bitset_obstack_alloc(&env->obst, get_irg_last_idx(env->irg)); // copy all live-outs into the livethrough_unused set - be_lv_foreach(env->cenv->lv, block, be_lv_state_in | be_lv_state_out, i) { - ir_node *irn = be_lv_get_irn(env->cenv->lv, block, i); + be_lv_foreach(lv, block, be_lv_state_in | be_lv_state_out, i) { + ir_node *irn = be_lv_get_irn(lv, block, i); int node_idx; if(!consider_for_spilling(env->arch, env->cls, irn)) @@ -428,10 +429,10 @@ static void spill_values(morgan_env_t *env, const loop_attr_t *loop_attr, int sp // spill values for(i = 0; i < spills; ++i) { ir_node *to_spill = candidates[i].node; - DBG((dbg, "Spilling %+F ", to_spill)); + DBG((dbg, DBG_CHOOSE, "Spilling %+F ", to_spill)); for(edge = set_first(loop_attr->out_edges); edge != NULL; edge = set_next(loop_attr->out_edges)) { - be_add_reload_on_edge(env->senv, to_spill, edge->block, edge->pos); + be_add_reload_on_edge(env->senv, to_spill, edge->block, edge->pos, env->cls); } } } @@ -441,8 +442,9 @@ static int reduce_register_pressure_in_block(morgan_env_t *env, const ir_node* b int max_pressure; int loop_unused_spills_needed; pset *live_nodes = pset_new_ptr_default(); + be_lv_t *lv = env->cenv->birg->lv; - be_liveness_end_of_block(env->cenv->lv, env->arch, env->cls, block, live_nodes); + be_liveness_end_of_block(lv, env->arch, env->cls, block, live_nodes); max_pressure = pset_count(live_nodes); DBG((dbg, DBG_LIVE, "Reduce pressure to %d In Block %+F:\n", env->registers_available, block)); @@ -463,8 +465,6 @@ static int reduce_register_pressure_in_block(morgan_env_t *env, const ir_node* b } del_pset(live_nodes); - DBG((dbg, DBG_PRESSURE, "\tMax Pressure in %+F: %d\n", block, max_pressure)); - loop_unused_spills_needed = max_pressure - env->registers_available; if(loop_unused_spills_needed < 0) { @@ -473,7 +473,8 @@ static int reduce_register_pressure_in_block(morgan_env_t *env, const ir_node* b loop_unused_spills_needed = loop_unused_spills_possible; } - DBG((dbg, DBG_PRESSURE, "Unused spills for Block %+F needed: %d\n", block, loop_unused_spills_needed)); + DBG((dbg, DBG_PRESSURE, "Block %+F: max-pressure %d spills possible: %d spills used: %d\n", + block, max_pressure, loop_unused_spills_possible, loop_unused_spills_needed)); return loop_unused_spills_needed; } @@ -519,8 +520,7 @@ static int reduce_register_pressure_in_loop(morgan_env_t *env, const ir_loop *lo } /* calculate number of spills needed in outer loop and spill - * unused livethrough nodes around this loop - */ + * unused livethrough nodes around this loop */ if(spills_needed > outer_spills_possible) { int spills_to_place; outer_spills_needed = outer_spills_possible; @@ -540,6 +540,7 @@ static int reduce_register_pressure_in_loop(morgan_env_t *env, const ir_loop *lo } void be_spill_morgan(be_chordal_env_t *chordal_env) { + ir_graph *irg = chordal_env->irg; morgan_env_t env; FIRM_DBG_REGISTER(dbg, "ir.be.spillmorgan"); @@ -560,34 +561,37 @@ void be_spill_morgan(be_chordal_env_t *chordal_env) { env.block_attr_set = new_set(block_attr_cmp, 20); /*-- Part1: Analysis --*/ - be_liveness_recompute(chordal_env->lv); + //Matze: I hope liveness information is up to date at this point... + //be_liveness_recompute(chordal_env->lv); /* construct control flow loop tree */ - construct_cf_backedges(chordal_env->irg); + if(! (get_irg_loopinfo_state(irg) & loopinfo_cf_consistent)) { + construct_cf_backedges(irg); + } /* construct loop out edges and livethrough_unused sets for loops and blocks */ - irg_block_walk_graph(chordal_env->irg, construct_block_livethrough_unused, construct_loop_edges, &env); - construct_loop_livethrough_unused(&env, get_irg_loop(env.irg)); + irg_block_walk_graph(irg, construct_block_livethrough_unused, construct_loop_edges, &env); + construct_loop_livethrough_unused(&env, get_irg_loop(irg)); /*-- Part2: Transformation --*/ /* spill unused livethrough values around loops and blocks where * the pressure is too high */ - reduce_register_pressure_in_loop(&env, get_irg_loop(env.irg), 0); + reduce_register_pressure_in_loop(&env, get_irg_loop(irg), 0); /* Insert real spill/reload nodes and fix usages */ be_insert_spills_reloads(env.senv); /* Verify the result */ if (chordal_env->opts->vrfy_option == BE_CH_VRFY_WARN) { - be_verify_schedule(env.irg); + be_verify_schedule(irg); } else if (chordal_env->opts->vrfy_option == BE_CH_VRFY_ASSERT) { - assert(be_verify_schedule(env.irg)); + assert(be_verify_schedule(irg)); } if (chordal_env->opts->dump_flags & BE_CH_DUMP_SPILL) - be_dump(env.irg, "-spillmorgan", dump_ir_block_graph_sched); + be_dump(irg, "-spillmorgan", dump_ir_block_graph_sched); /* cleanup */ free_loop_edges(&env);