X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillremat.c;h=f4216c36afda5e4bb2b17fcffc8e31538e9481f7;hb=80a6158fdd766f42ee6c508a773bc114ff1b61f3;hp=2b79d3f9a7c1686bfc386eb4f7eb92cf149e3456;hpb=4b02096340f41e7819006c0d933a3adeca25f536;p=libfirm diff --git a/ir/be/bespillremat.c b/ir/be/bespillremat.c index 2b79d3f9a..f4216c36a 100644 --- a/ir/be/bespillremat.c +++ b/ir/be/bespillremat.c @@ -157,11 +157,17 @@ static const lc_opt_table_entry_t options[] = { { NULL } }; -void be_spill_remat_register_options(lc_opt_entry_t *grp) +void be_init_spillremat(void) { - lc_opt_entry_t *my_grp = lc_opt_get_grp(grp, "remat"); - lc_opt_add_table(my_grp, options); + lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be"); + lc_opt_entry_t *ra_grp = lc_opt_get_grp(be_grp, "ra"); + lc_opt_entry_t *chordal_grp = lc_opt_get_grp(ra_grp, "chordal"); + lc_opt_entry_t *remat_grp = lc_opt_get_grp(chordal_grp, "remat"); + + lc_opt_add_table(remat_grp, options); } + +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillremat); #endif @@ -430,7 +436,7 @@ execution_frequency(const spill_ilp_t *si, const ir_node * irn) return ((double)be_profile_get_block_execcount(get_block(irn))) + FUDGE; #ifndef EXECFREQ_LOOPDEPH - return get_block_execfreq(si->chordal_env->exec_freq, get_block(irn)) + FUDGE; + return get_block_execfreq(si->chordal_env->birg->exec_freq, get_block(irn)) + FUDGE; #else if(is_Block(irn)) return exp(get_loop_depth(get_irn_loop(irn)) * log(10)) + FUDGE; @@ -3401,16 +3407,14 @@ connect_all_spills_with_keep(spill_ilp_t * si) /** insert a spill at an arbitrary position */ ir_node *be_spill2(const arch_env_t *arch_env, ir_node *irn, ir_node *insert) { - ir_node *bl = is_Block(insert)?insert:get_nodes_block(insert); + ir_node *bl = is_Block(insert)?insert:get_nodes_block(insert); ir_graph *irg = get_irn_irg(bl); - ir_node *frame = get_irg_frame(irg); - ir_node *spill; - ir_node *next; - - const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, irn, -1); - const arch_register_class_t *cls_frame = arch_get_irn_reg_class(arch_env, frame, -1); + ir_node *frame = get_irg_frame(irg); + ir_node *spill; + ir_node *next; + const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, irn, -1); - spill = be_new_Spill(cls, cls_frame, irg, bl, frame, irn); + spill = be_new_Spill(cls, irg, bl, irn); /* * search the right insertion point. a spill of a phi cannot be put @@ -3424,7 +3428,7 @@ ir_node *be_spill2(const arch_env_t *arch_env, ir_node *irn, ir_node *insert) * which is its default initialization (see above). */ - if(bl == get_irg_start_block(irg) && sched_get_time_step(frame) >= sched_get_time_step(insert)) + if (bl == get_irg_start_block(irg) && sched_get_time_step(frame) >= sched_get_time_step(insert)) insert = frame; for (next = sched_next(insert); is_Phi(next) || is_Proj(next); next = sched_next(insert)) @@ -4135,9 +4139,9 @@ dump_phi_class(spill_ilp_t * si, pset * phiclass, const char * file) static void rewire_uses(spill_ilp_t * si) { - dom_front_info_t *dfi = be_compute_dominance_frontiers(si->chordal_env->irg); defs_t *defs; pset *ignore = pset_new_ptr(1); + be_dom_front_info_t *dom_front = si->chordal_env->birg->dom_front; pset_insert_ptr(ignore, get_irg_end(si->chordal_env->irg)); @@ -4166,7 +4170,7 @@ rewire_uses(spill_ilp_t * si) // print_irn_pset(spills); // print_irn_pset(reloads); - be_ssa_constr_set_ignore(dfi, si->lv, spills, ignore); + be_ssa_constr_set_ignore(dom_front, si->lv, spills, ignore); } del_pset(reloads); @@ -4192,15 +4196,13 @@ rewire_uses(spill_ilp_t * si) } DBG((si->dbg, LEVEL_4, "\t %d new definitions for value %+F\n", pset_count(nodes)-orig_kept, defs->value)); - be_ssa_constr_set(dfi, si->lv, nodes); + be_ssa_constr_set(dom_front, si->lv, nodes); del_pset(nodes); } } // remove_unused_defs(si); - - be_free_dominance_frontiers(dfi); } @@ -4351,6 +4353,7 @@ be_spill_remat(const be_chordal_env_t * chordal_env) char dump_suffix2[256]; struct obstack obst; spill_ilp_t si; + be_irg_t *birg = chordal_env->birg; ir_snprintf(problem_name, sizeof(problem_name), "%F_%s", chordal_env->irg, chordal_env->cls->name); ir_snprintf(dump_suffix, sizeof(dump_suffix), "-%s-remats", chordal_env->cls->name); @@ -4362,6 +4365,9 @@ be_spill_remat(const be_chordal_env_t * chordal_env) if(opt_verify & VERIFY_DOMINANCE) be_check_dominance(chordal_env->irg); + be_assure_dom_front(birg); + be_assure_liveness(birg); + obstack_init(&obst); si.chordal_env = chordal_env; si.obst = &obst; @@ -4373,7 +4379,7 @@ be_spill_remat(const be_chordal_env_t * chordal_env) si.all_possible_remats = pset_new_ptr_default(); si.spills = pset_new_ptr_default(); si.inverse_ops = pset_new_ptr_default(); - si.lv = chordal_env->lv; + si.lv = birg->lv; si.keep = NULL; si.n_regs = get_n_regs(&si); @@ -4536,7 +4542,7 @@ be_spill_remat(const be_chordal_env_t * chordal_env) #else /* WITH_ILP */ -static void +static void INLINE only_that_you_can_compile_without_WITH_ILP_defined(void) { }