X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbemain.c;h=c476f88b4c8589f7593a4df2afa917476985504a;hb=4ed245f5007168dab7850942a7ee6b6b29a19817;hp=efbf98858cff323381cf1e09e3ebe15ef1937c97;hpb=26b5d6f7898d59686f8cb2653287f4f0a761ce2a;p=libfirm diff --git a/ir/be/bemain.c b/ir/be/bemain.c index efbf98858..c476f88b4 100644 --- a/ir/be/bemain.c +++ b/ir/be/bemain.c @@ -28,6 +28,7 @@ #include "iredges_t.h" #include "irloop_t.h" #include "irtools.h" +#include "irvrfy.h" #include "return.h" #include "firmstat.h" @@ -65,6 +66,8 @@ static be_options_t be_options = { DUMP_NONE, /* dump options */ BE_TIME_OFF, /* no timing */ + BE_SCHED_SELECT_HEUR, /* mueller heuristic selector */ + 0, /* disable mris */ "i44pc52.info.uni-karlsruhe.de", /* ilp server */ "cplex" /* ilp solver */ }; @@ -81,9 +84,6 @@ static const be_ra_t *ra = &be_ra_chordal_allocator; /* back end instruction set architecture to use */ static const arch_isa_if_t *isa_if = &ia32_isa_if; -/* mris option */ -static int be_enable_mris = 0; - #ifdef WITH_LIBCORE static lc_opt_entry_t *be_grp_root = NULL; @@ -128,6 +128,15 @@ static const lc_opt_enum_int_items_t vrfy_items[] = { { NULL, 0 } }; +/* schedule selector options. */ +static const lc_opt_enum_int_items_t sched_select_items[] = { + { "isa", BE_SCHED_SELECT_ISA }, + { "muchnik", BE_SCHED_SELECT_MUCHNIK }, + { "heur", BE_SCHED_SELECT_HEUR }, + { "hmuchnik", BE_SCHED_SELECT_HMUCHNIK }, + { NULL, 0 } +}; + static lc_opt_enum_mask_var_t dump_var = { &dump_flags, dump_items }; @@ -144,14 +153,19 @@ static lc_opt_enum_int_var_t vrfy_var = { &vrfy_option, vrfy_items }; +static lc_opt_enum_int_var_t sched_select_var = { + &be_options.sched_select, sched_select_items +}; + static const lc_opt_table_entry_t be_main_options[] = { - LC_OPT_ENT_ENUM_MASK("dump", "dump irg on several occasions", &dump_var), - LC_OPT_ENT_ENUM_PTR ("ra", "register allocator", &ra_var), - LC_OPT_ENT_ENUM_PTR ("isa", "the instruction set architecture", &isa_var), - LC_OPT_ENT_NEGBOOL ("noomitfp", "do not omit frame pointer", &be_omit_fp), - LC_OPT_ENT_BOOL ("mris", "enable mris schedule preparation", &be_enable_mris), - LC_OPT_ENT_ENUM_PTR ("vrfy", "verify the backend irg (off, warn, assert)", &vrfy_var), - LC_OPT_ENT_BOOL ("time", "get backend timing statistics", &be_options.timing), + LC_OPT_ENT_ENUM_MASK("dump", "dump irg on several occasions", &dump_var), + LC_OPT_ENT_ENUM_PTR ("ra", "register allocator", &ra_var), + LC_OPT_ENT_ENUM_PTR ("isa", "the instruction set architecture", &isa_var), + LC_OPT_ENT_NEGBOOL ("noomitfp", "do not omit frame pointer", &be_omit_fp), + LC_OPT_ENT_ENUM_PTR ("vrfy", "verify the backend irg (off, warn, assert)", &vrfy_var), + LC_OPT_ENT_BOOL ("time", "get backend timing statistics", &be_options.timing), + LC_OPT_ENT_BOOL ("sched.mris", "enable mris schedule preparation", &be_options.mris), + LC_OPT_ENT_ENUM_PTR ("sched.select", "schedule node selector (isa, muchnik, heur, hmuchnik)",&sched_select_var), #ifdef WITH_ILP LC_OPT_ENT_STR ("ilp.server", "the ilp server name", be_options.ilp_server, sizeof(be_options.ilp_server)), @@ -474,7 +488,7 @@ static void be_main_loop(FILE *file_handle) /* schedule the irg */ BE_TIMER_PUSH(t_sched); - list_sched(&birg, be_enable_mris); + list_sched(&birg, &be_options); BE_TIMER_POP(t_sched); dump(DUMP_SCHED, irg, "-sched", dump_ir_block_graph_sched); @@ -547,8 +561,19 @@ static void be_main_loop(FILE *file_handle) /* check schedule and register allocation */ BE_TIMER_PUSH(t_verify); - be_sched_vrfy(birg.irg, vrfy_option); - be_verify_register_allocation(env.arch_env, birg.irg); + if (vrfy_option == BE_VRFY_WARN) { + //irg_verify(birg.irg, VRFY_ENFORCE_SSA); + be_check_dominance(birg.irg); + be_verify_schedule(birg.irg); + be_verify_register_allocation(env.arch_env, birg.irg); + } + else if (vrfy_option == BE_VRFY_ASSERT) { + //assert(irg_verify(birg.irg, VRFY_ENFORCE_SSA) && "irg verification failed"); + assert(be_check_dominance(birg.irg) && "Dominance verification failed"); + assert(be_verify_schedule(birg.irg) && "Schedule verification failed"); + assert(be_verify_register_allocation(env.arch_env, birg.irg) + && "register allocation verification failed"); + } BE_TIMER_POP(t_verify); /* emit assembler code */ @@ -566,11 +591,6 @@ static void be_main_loop(FILE *file_handle) restore_optimization_state(&state); BE_TIMER_ONLY(num_nodes_a = get_num_reachable_nodes(irg)); - - /* switched off due to statistics (statistic module needs all irgs) */ - if (! stat_is_active()) - free_ir_graph(irg); - BE_TIMER_POP(t_other); #define LC_EMIT(timer) printf("%-20s: %.3lf msec\n", lc_timer_get_description(timer), (double)lc_timer_elapsed_usec(timer) / 1000.0) @@ -603,6 +623,11 @@ static void be_main_loop(FILE *file_handle) LC_EMIT(t_other); } #undef LC_EMIT + + /* switched off due to statistics (statistic module needs all irgs) */ + if (! stat_is_active()) + free_ir_graph(irg); + } be_done_env(&env);