X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyoptmain.c;h=5fc48f47aa8a0a5e6fd2264cfe3ded3b850e9ca4;hb=3c751b006ff4ad049b3733a082efd2f30c8fdbca;hp=ebb7cbe2ee0707f6520b815c6e30ea5feec15d46;hpb=e03dd955762d16d38fdec0e2d7c24bf36d0ecc2e;p=libfirm diff --git a/ir/be/becopyoptmain.c b/ir/be/becopyoptmain.c index ebb7cbe2e..5fc48f47a 100644 --- a/ir/be/becopyoptmain.c +++ b/ir/be/becopyoptmain.c @@ -13,19 +13,22 @@ #endif #include + #include "pmap.h" #include "debug.h" #include "irouts.h" +#include "bearch.h" #include "becopyopt.h" #include "becopystat.h" #include "becopyoptmain.h" #include "phiclass.h" #define DO_HEUR -#define DO_ILP -#define DO_ILP_N_SEC +#undef DO_ILP_5_SEC +#undef DO_ILP_30_SEC +#undef DO_ILP -#define DEBUG_LVL SET_LEVEL_0 +#define DEBUG_LVL SET_LEVEL_1 static firm_dbg_module_t *dbg = NULL; void be_copy_opt_init(void) { @@ -42,43 +45,45 @@ typedef struct color_saver { static void save_load(ir_node *irn, void *env) { color_save_t *saver = env; - if (saver->chordal_env->cls == arch_get_irn_reg_class(saver->arch_env, irn, arch_pos_make_out(0))) { + if (saver->chordal_env->cls == arch_get_irn_reg_class(saver->arch_env, irn, -1)) { if (saver->flag == 0) { /* save */ - const arch_register_t *reg = arch_get_irn_register(saver->arch_env, irn, 0); + const arch_register_t *reg = arch_get_irn_register(saver->arch_env, irn); pmap_insert(saver->saved_colors, irn, (void *) reg); } else { /*load */ arch_register_t *reg = pmap_get(saver->saved_colors, irn); - arch_set_irn_register(saver->arch_env, irn, 0, reg); + arch_set_irn_register(saver->arch_env, irn, reg); } } } static void save_colors(color_save_t *color_saver) { color_saver->flag = 0; - irg_walk_graph(color_saver->chordal_env->session_env->irg, save_load, NULL, color_saver); + irg_walk_graph(color_saver->chordal_env->irg, save_load, NULL, color_saver); } static void load_colors(color_save_t *color_saver) { color_saver->flag = 1; - irg_walk_graph(color_saver->chordal_env->session_env->irg, save_load, NULL, color_saver); + irg_walk_graph(color_saver->chordal_env->irg, save_load, NULL, color_saver); } void be_copy_opt(be_chordal_env_t *chordal_env) { copy_opt_t *co; - int costs, costs_init=-1, costs_heur=-1, costs_ilp_n_sec=-1, costs_ilp=-1; - int lower_bound; + int costs, costs_init=-1, costs_heur=-1, costs_ilp_5_sec=-1, costs_ilp_30_sec=-1, costs_ilp=-1; + int lower_bound = -1; + int was_optimal = 0; + color_save_t saver; - saver.arch_env = chordal_env->session_env->main_env->arch_env; + saver.arch_env = chordal_env->main_env->arch_env; saver.chordal_env = chordal_env; saver.saved_colors = pmap_create(); /* BETTER: You can remove this if you replace all * `grep get_irn_out *.c` by the irouts.h module.*/ - compute_outs(chordal_env->session_env->irg); + compute_irg_outs(chordal_env->irg); co = new_copy_opt(chordal_env, get_costs_loop_depth); DBG((dbg, LEVEL_1, "----> CO: %s\n", co->name)); - phi_class_compute(chordal_env->session_env->irg); + phi_class_compute(chordal_env->irg); #ifdef DO_STAT lower_bound = co_get_lower_bound(co); @@ -93,14 +98,16 @@ void be_copy_opt(be_chordal_env_t *chordal_env) { DBG((dbg, LEVEL_1, "Init costs: %3d\n", costs_init)); #endif - save_colors(&saver); +// save_colors(&saver); #ifdef DO_HEUR - lc_timer_t *timer = lc_timer_register("heur", NULL); - lc_timer_reset_and_start(timer); - co_heur_opt(co); - lc_timer_stop(timer); - copystat_add_heur_time(lc_timer_elapsed_msec(timer)); + { + lc_timer_t *timer = lc_timer_register("heur", NULL); + lc_timer_reset_and_start(timer); + co_heur_opt(co); + lc_timer_stop(timer); + copystat_add_heur_time(lc_timer_elapsed_msec(timer)); + } #ifdef DO_STAT costs = co_get_copy_costs(co); costs_heur = costs; @@ -110,24 +117,33 @@ void be_copy_opt(be_chordal_env_t *chordal_env) { assert(lower_bound == -1 || costs_heur == -1 || lower_bound <= costs_heur); #endif +#ifdef DO_ILP_5_SEC load_colors(&saver); - -#ifdef DO_ILP_N_SEC - co_ilp_opt(co, 2.0); + was_optimal = co_ilp_opt(co, 5.0); #ifdef DO_STAT costs = co_get_copy_costs(co); - costs_ilp_n_sec = costs; - copystat_add_ilp_n_sec_costs(costs_ilp_n_sec); - DBG((dbg, LEVEL_1, "N_Sec costs: %3d\n", costs_ilp_n_sec)); + costs_ilp_5_sec = costs; + copystat_add_ilp_5_sec_costs(costs_ilp_5_sec); + DBG((dbg, LEVEL_1, "5_Sec costs: %3d\n", costs_ilp_5_sec)); #endif - assert(lower_bound == -1 || costs_ilp == -1 || lower_bound <= costs_ilp); - assert(costs_ilp == -1 || costs_heur == -1 || costs_ilp <= costs_heur); #endif - load_colors(&saver); +#ifdef DO_ILP_30_SEC + if (!was_optimal) { + load_colors(&saver); + co_ilp_opt(co, 30.0); + } +#ifdef DO_STAT + costs = co_get_copy_costs(co); + costs_ilp_30_sec = costs; + copystat_add_ilp_30_sec_costs(costs_ilp_30_sec); + DBG((dbg, LEVEL_1, "30_Sec costs: %3d\n", costs_ilp_30_sec)); +#endif +#endif #ifdef DO_ILP - co_ilp_opt(co, 0.0); + load_colors(&saver); + co_ilp_opt(co, 60.0); #ifdef DO_STAT costs = co_get_copy_costs(co); costs_ilp = costs; @@ -135,7 +151,6 @@ void be_copy_opt(be_chordal_env_t *chordal_env) { DBG((dbg, LEVEL_1, "Opt costs: %3d\n", costs_ilp)); #endif assert(lower_bound == -1 || costs_ilp == -1 || lower_bound <= costs_ilp); - assert(costs_ilp == -1 || costs_heur == -1 || costs_ilp <= costs_heur); #endif pmap_destroy(saver.saved_colors);