X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=driver%2Ffirm_opt.c;h=7b0e3a6be6bd8e6689e6ecd08b81426dbe709195;hb=02f47f268839c472e23095ac0025e5ccbb5ed70a;hp=637995ca0d02bc81887382b79b6037861c1d3fea;hpb=82d978b5f7ddefeea8123bc5da97677603056ceb;p=cparser diff --git a/driver/firm_opt.c b/driver/firm_opt.c index 637995c..7b0e3a6 100644 --- a/driver/firm_opt.c +++ b/driver/firm_opt.c @@ -19,6 +19,7 @@ #include "firm_codegen.h" #include "firm_cmdline.h" #include "firm_timing.h" +#include "ast2firm.h" #ifdef _WIN32 #define snprintf _snprintf @@ -309,6 +310,7 @@ static void do_optimize_funccalls(void) static void do_gcse(ir_graph *irg) { set_opt_global_cse(1); + optimize_graph_df(irg); place_code(irg); set_opt_global_cse(0); } @@ -330,7 +332,7 @@ static void do_stred(ir_graph *irg) static void do_inline(void) { - inline_functions(500, 50); + inline_functions(firm_opt.inline_maxsize, firm_opt.inline_threshold); } static void do_cloning(void) @@ -386,6 +388,7 @@ static opt_config_t opts[] = { { OPT_TARGET_IRG, "gvnpre", (func_ptr_t) do_gvn_pre, true, true, true, -1 }, { OPT_TARGET_IRG, "ifconv", (func_ptr_t) do_if_conv, true, true, true, TV_IF_CONV }, { OPT_TARGET_IRG, "bool", (func_ptr_t) opt_bool, true, true, true, -1 }, + { OPT_TARGET_IRG, "shape-blocks",(func_ptr_t) shape_blocks, true, true, true, TV_END_MELT }, { OPT_TARGET_IRG, "stred", (func_ptr_t) do_stred, true, true, true, TV_OSR }, { OPT_TARGET_IRG, "dead", (func_ptr_t) dead_node_elimination, true, false, true, TV_DEAD_NODE }, { OPT_TARGET_IRP, "inline", (func_ptr_t) do_inline, true, true, true, -1 }, @@ -478,6 +481,7 @@ static void do_firm_optimizations(const char *input_filename) set_opt_scalar_replacement(firm_opt.scalar_replace); set_opt_auto_create_sync(firm_opt.auto_sync); set_opt_alias_analysis(firm_opt.alias_analysis); + set_opt_combo(firm_opt.combo); aa_opt = aa_opt_no_opt; if (firm_opt.strict_alias) @@ -503,6 +507,7 @@ static void do_firm_optimizations(const char *input_filename) set_opt_enabled("gvnpre", firm_opt.gvn_pre); set_opt_enabled("ifconv", firm_opt.if_conversion); set_opt_enabled("bool", firm_opt.bool_opt); + set_opt_enabled("shape-blocks", firm_opt.shape_blocks); set_opt_enabled("inline", firm_opt.do_inline); set_opt_enabled("clone", firm_opt.cloning); set_opt_enabled("combo", firm_opt.combo); @@ -533,12 +538,6 @@ static void do_firm_optimizations(const char *input_filename) for (i = 0; i < get_irp_n_irgs(); i++) { ir_graph *irg = get_irp_irg(i); -#ifdef FIRM_EXT_GRS - /* If SIMD optimization is on, make sure we have only 1 return */ - if (firm_ext_grs.create_pattern || firm_ext_grs.simd_opt) - do_irg_opt("onereturn"); -#endif - do_irg_opt(irg, "scalar"); do_irg_opt(irg, "local"); do_irg_opt(irg, "reassoc"); @@ -559,7 +558,6 @@ static void do_firm_optimizations(const char *input_filename) do_irg_opt(irg, "lower"); do_irg_opt(irg, "deconv"); do_irg_opt(irg, "condeval"); - do_irg_opt(irg, "lower_switch"); do_irg_opt(irg, "remove_confirms"); do_irg_opt(irg, "gvnpre"); do_irg_opt(irg, "place"); @@ -572,6 +570,8 @@ static void do_firm_optimizations(const char *input_filename) } do_irg_opt(irg, "bool"); + do_irg_opt(irg, "shape-blocks"); + do_irg_opt(irg, "lower_switch"); do_irg_opt(irg, "stred"); do_irg_opt(irg, "local"); do_irg_opt(irg, "dead"); @@ -796,21 +796,14 @@ static void do_firm_lowering(const char *input_filename) { int i; - /* do class lowering and vtbl creation */ -// lower_classes_to_struct("vtbl", "m"); - -#if 0 - timer_push(TV_LOWER); - lower_highlevel(); - timer_pop(); -#endif - if (firm_opt.lower_ll) { lwrdw_param_t init = { 1, 1, - mode_Ls, mode_Lu, - mode_Is, mode_Iu, + get_atomic_mode(ATOMIC_TYPE_LONGLONG), + get_atomic_mode(ATOMIC_TYPE_ULONGLONG), + get_atomic_mode(ATOMIC_TYPE_INT), + get_atomic_mode(ATOMIC_TYPE_UINT), def_create_intrinsic_fkt, NULL }; @@ -842,14 +835,9 @@ static void do_firm_lowering(const char *input_filename) /* run reassociation first on all graphs BEFORE the architecture dependent optimizations are enabled */ for (i = get_irp_n_irgs() - 1; i >= 0; --i) { - current_ir_graph = get_irp_irg(i); - - timer_push(TV_REASSOCIATION); - optimize_reassociation(current_ir_graph); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "reassoc"); - CHECK_ONE(firm_opt.check_all, current_ir_graph); - } + ir_graph *irg = get_irp_irg(i); + do_irg_opt(irg, "reassoc"); + } /* enable architecture dependent optimizations */ arch_dep_set_opts((arch_dep_opts_t) @@ -858,63 +846,23 @@ static void do_firm_lowering(const char *input_filename) (firm_opt.mods ? arch_dep_mod_by_const : arch_dep_none) )); for (i = get_irp_n_irgs() - 1; i >= 0; --i) { - current_ir_graph = get_irp_irg(i); - - if (firm_opt.gcse) - set_opt_global_cse(1); - - timer_push(TV_LOCAL_OPT); - optimize_graph_df(current_ir_graph); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "lopt"); - if (! firm_opt.gcse) - CHECK_ONE(firm_opt.check_all, current_ir_graph); - - if (firm_opt.gcse) { - timer_push(TV_CODE_PLACE); - place_code(current_ir_graph); - set_opt_global_cse(0); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "place"); - CHECK_ONE(firm_opt.check_all, current_ir_graph); - } - - timer_push(TV_LOAD_STORE); - optimize_load_store(current_ir_graph); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "ldst"); - CHECK_ONE(firm_opt.check_all, current_ir_graph); - + ir_graph *irg = get_irp_irg(i); - timer_push(TV_LOCAL_OPT); - optimize_graph_df(current_ir_graph); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "lopt"); + current_ir_graph = irg; - timer_push(TV_CF_OPT); - optimize_cf(current_ir_graph); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "cf"); - CHECK_ONE(firm_opt.check_all, current_ir_graph); + do_irg_opt(irg, "local"); + do_irg_opt(irg, "gcse"); + do_irg_opt(irg, "ldst"); + do_irg_opt(irg, "local"); + do_irg_opt(irg, "controlflow"); if (firm_opt.if_conversion) { - timer_push(TV_IF_CONV); - opt_if_conv(current_ir_graph, if_conv_info); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "if"); - CHECK_ONE(firm_opt.check_all, current_ir_graph); - - timer_push(TV_LOCAL_OPT); - optimize_graph_df(current_ir_graph); - timer_pop(); - timer_push(TV_CF_OPT); - optimize_cf(current_ir_graph); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "after_if"); - CHECK_ONE(firm_opt.check_all, current_ir_graph); - } + do_irg_opt(irg, "ifconv"); + do_irg_opt(irg, "local"); + do_irg_opt(irg, "controlflow"); + } - do_irg_opt(current_ir_graph, "sync"); + do_irg_opt(current_ir_graph, "sync"); } timer_stop(TV_ALL_OPT); @@ -961,13 +909,6 @@ void gen_firm_init(void) params.cc_mask = 0; /* no regparam, cdecl */ params.builtin_dbg = NULL; - #ifdef FIRM_EXT_GRS - /* Activate Graph rewriting if SIMD optimization is turned on */ - /* This has to be done before init_firm() is called! */ - if (firm_ext_grs.simd_opt) - ext_grs_activate(); -#endif - init_firm(¶ms); if (firm_be_opt.selection == BE_FIRM_BE) { @@ -985,23 +926,9 @@ void gen_firm_init(void) if (be_params->has_imm_fp_mode) firm_imm_fp_mode = be_params->imm_fp_mode; } - /* OS option must be set to the backend */ - switch (firm_opt.os_support) { - case OS_SUPPORT_MINGW: - firm_be_option("ia32-gasmode=mingw"); - break; - case OS_SUPPORT_MACHO: - firm_be_option("ia32-gasmode=macho"); - break; - case OS_SUPPORT_LINUX: - default: - firm_be_option("ia32-gasmode=linux"); - break; - } dbg_init(NULL, NULL, dbg_snprint); edges_init_dbg(firm_opt.vrfy_edges); - //cbackend_set_debug_retrieve(dbg_retrieve); set_opt_precise_exc_context(firm_opt.precise_exc); set_opt_fragile_ops(firm_opt.fragile_ops); @@ -1136,23 +1063,6 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int new_ for (i = get_irp_n_irgs() - 1; i >= 0; --i) set_irg_phase_low(get_irp_irg(i)); - -#ifdef FIRM_EXT_GRS - /** SIMD Optimization Extensions **/ - - /* Pattern creation step. No code has to be generated, so - exit after pattern creation */ - if (firm_ext_grs.create_pattern) { - ext_grs_create_pattern(); - exit(0); - } - - /* SIMD optimization step. Uses graph patterns to find - rich instructions and rewrite */ - if (firm_ext_grs.simd_opt) - ext_grs_simd_opt(); -#endif - if (firm_dump.statistic & STAT_FINAL_IR) stat_dump_snapshot(input_filename, "final-ir"); @@ -1162,18 +1072,14 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int new_ if (firm_dump.statistic & STAT_FINAL) stat_dump_snapshot(input_filename, "final"); - -#if 0 - if (firm_opt.ycomp_dbg) - firm_finish_ycomp_debugger(); -#endif -} /* gen_firm_finish */ +} /** * Do very early initializations */ -void firm_early_init(void) { +void firm_early_init(void) +{ /* arg: need this here for command line options */ be_opt_register(); firm_init_options(NULL, 0, NULL); -} /* firm_early_init */ +}