X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyopt.c;h=7b7affc5ef0c2c30b5f997d7ff6ca94a2742a01e;hb=04bdfdfd695bd5d7e9c45f59074ac6bed4148ec7;hp=6cf88f7f1c64e867cc527bba9e62792044609758;hpb=04a44481131aeef9e6c67b26a9e76557e6873082;p=libfirm diff --git a/ir/be/becopyopt.c b/ir/be/becopyopt.c index 6cf88f7f1..7b7affc5e 100644 --- a/ir/be/becopyopt.c +++ b/ir/be/becopyopt.c @@ -48,7 +48,7 @@ #include "bemodule.h" #include "bearch.h" -#include "benode_t.h" +#include "benode.h" #include "beutil.h" #include "beifg_t.h" #include "beintlive_t.h" @@ -77,7 +77,6 @@ static unsigned dump_flags = 0; static unsigned style_flags = 0; static unsigned do_stats = 0; static cost_fct_t cost_func = co_get_costs_exec_freq; -static unsigned algo = CO_ALGO_HEUR4; static int improve = 1; static const lc_opt_enum_mask_items_t dump_items[] = { @@ -97,17 +96,6 @@ static const lc_opt_enum_mask_items_t style_items[] = { { NULL, 0 } }; -static const lc_opt_enum_mask_items_t algo_items[] = { - { "none", CO_ALGO_NONE }, - { "heur", CO_ALGO_HEUR }, - { "heur2", CO_ALGO_HEUR2 }, - { "heur3", CO_ALGO_HEUR3 }, - { "heur4", CO_ALGO_HEUR4 }, - { "ilp", CO_ALGO_ILP }, - { "pbqp", CO_ALGO_PBQP }, - { NULL, 0 } -}; - typedef int (*opt_funcptr)(void); static const lc_opt_enum_func_ptr_items_t cost_func_items[] = { @@ -125,30 +113,30 @@ static lc_opt_enum_mask_var_t style_var = { &style_flags, style_items }; -static lc_opt_enum_mask_var_t algo_var = { - &algo, algo_items -}; - static lc_opt_enum_func_ptr_var_t cost_func_var = { (opt_funcptr*) &cost_func, cost_func_items }; static const lc_opt_table_entry_t options[] = { - LC_OPT_ENT_ENUM_INT ("algo", "select copy optimization algo", &algo_var), LC_OPT_ENT_ENUM_FUNC_PTR ("cost", "select a cost function", &cost_func_var), LC_OPT_ENT_ENUM_MASK ("dump", "dump ifg before or after copy optimization", &dump_var), LC_OPT_ENT_ENUM_MASK ("style", "dump style for ifg dumping", &style_var), LC_OPT_ENT_BOOL ("stats", "dump statistics after each optimization", &do_stats), - LC_OPT_ENT_BOOL ("improve", "run heur3 before if algo can exploit start solutions", &improve), + LC_OPT_ENT_BOOL ("improve", "run heur1 before if algo can exploit start solutions", &improve), LC_OPT_LAST }; -/* Insert additional options registration functions here. */ -extern void be_co_ilp_register_options(lc_opt_entry_t *grp); -extern void be_co2_register_options(lc_opt_entry_t *grp); -extern void be_co3_register_options(lc_opt_entry_t *grp); +static be_module_list_entry_t *copyopts = NULL; +static const co_algo_info *selected_copyopt = NULL; -void be_init_copycoal(void) +void be_register_copyopt(const char *name, co_algo_info *copyopt) +{ + if (selected_copyopt == NULL) + selected_copyopt = copyopt; + be_add_module_to_list(©opts, name, copyopt); +} + +void be_init_copyopt(void) { 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"); @@ -156,9 +144,28 @@ void be_init_copycoal(void) lc_opt_entry_t *co_grp = lc_opt_get_grp(chordal_grp, "co"); lc_opt_add_table(co_grp, options); + be_add_module_list_opt(co_grp, "algo", "select copy optimization algo", + ©opts, (void**) &selected_copyopt); +} + +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyopt); + +static int void_algo(copy_opt_t *co) +{ + (void) co; + return 0; } -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copycoal); +void be_init_copynone(void) +{ + static co_algo_info copyheur = { + void_algo, 0 + }; + + be_register_copyopt("none", ©heur); +} + +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copynone); #undef QUICK_AND_DIRTY_HACK @@ -1083,46 +1090,6 @@ void co_solve_park_moon(copy_opt_t *opt) (void) opt; } -static int void_algo(copy_opt_t *co) -{ - (void) co; - return 0; -} - -/* - _ _ _ _ _ - / \ | | __ _ ___ _ __(_) |_| |__ _ __ ___ ___ - / _ \ | |/ _` |/ _ \| '__| | __| '_ \| '_ ` _ \/ __| - / ___ \| | (_| | (_) | | | | |_| | | | | | | | \__ \ - /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|___/ - |___/ -*/ - -typedef struct { - co_algo_t *algo; - const char *name; - int can_improve_existing; -} co_algo_info_t; - -static co_algo_info_t algos[] = { - { void_algo, "none", 0 }, - { co_solve_heuristic, "heur1", 0 }, - { co_solve_heuristic_new, "heur2", 0 }, -#ifdef WITH_JVM - { co_solve_heuristic_java, "heur3", 0 }, -#else - { NULL, "heur3", 0 }, -#endif - { co_solve_heuristic_mst, "heur4", 0 }, -#ifdef WITH_ILP - { co_solve_ilp2, "ilp", 1 }, -#else - { NULL, "ilp", 1 }, -#endif - { co_solve_heuristic_pbqp, "pbqp", 0 }, - { NULL, "", 0 } -}; - /* __ __ _ ____ _ | \/ | __ _(_)_ __ | _ \ _ __(_)_ _____ _ __ @@ -1159,13 +1126,15 @@ static FILE *my_open(const be_chordal_env_t *env, const char *prefix, const char void co_driver(be_chordal_env_t *cenv) { - ir_timer_t *timer = ir_timer_register("firm.be.copyopt", "runtime"); + ir_timer_t *timer = ir_timer_new(); co_complete_stats_t before, after; copy_opt_t *co; - co_algo_t *algo_func; int was_optimal = 0; - if (algo >= CO_ALGO_LAST) + assert(selected_copyopt); + + /* skip copymin if algo is 'none' */ + if(selected_copyopt->copyopt == void_algo) return; be_liveness_assure_chk(be_get_birg_liveness(cenv->birg)); @@ -1191,37 +1160,26 @@ void co_driver(be_chordal_env_t *cenv) fclose(f); } - /* if the algo can improve results, provide an initial solution with heur3 */ - if (improve && algos[algo].can_improve_existing) { + /* if the algo can improve results, provide an initial solution with heur1 */ + if (improve && selected_copyopt->can_improve_existing) { co_complete_stats_t stats; /* produce a heuristic solution */ -#ifdef WITH_JVM - co_solve_heuristic_java(co); -#else co_solve_heuristic(co); -#endif /* WITH_JVM */ /* do the stats and provide the current costs */ co_complete_stats(co, &stats); be_stat_ev_ull("co_prepare_costs", stats.costs); } -#ifdef WITH_JVM - /* start the JVM here so that it does not tamper the timing. */ - if (algo == CO_ALGO_HEUR3) - be_java_coal_start_jvm(); -#endif /* WITH_JVM */ - - algo_func = algos[algo].algo; - /* perform actual copy minimization */ ir_timer_reset_and_start(timer); - was_optimal = algo_func(co); + was_optimal = selected_copyopt->copyopt(co); ir_timer_stop(timer); be_stat_ev("co_time", ir_timer_elapsed_msec(timer)); be_stat_ev_ull("co_optimal", was_optimal); + ir_timer_free(timer); if (dump_flags & DUMP_AFTER) { FILE *f = my_open(cenv, "", "-after.dot");