X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=driver%2Ffirm_opt.c;h=b2349488446ca5894eadd9331ea922ae6c21b948;hb=90708018c33219ee4a3d64e0017677231c84d2ba;hp=8d3d3fa2ec30f4f859043252632aa39a44fcd1fa;hpb=d217c156ea797324c9ab32c256f93fd4c7e5dc39;p=cparser diff --git a/driver/firm_opt.c b/driver/firm_opt.c index 8d3d3fa..b234948 100644 --- a/driver/firm_opt.c +++ b/driver/firm_opt.c @@ -9,10 +9,7 @@ #include #include #include - -#ifdef FIRM_BACKEND #include -#endif /* FIRM_BACKEND */ #include "firm_opt.h" @@ -112,6 +109,8 @@ static create_intrinsic_fkt *arch_create_intrinsic = NULL; static void *create_intrinsic_ctx = NULL; static const ir_settings_if_conv_t *if_conv_info = NULL; +ir_mode *firm_imm_fp_mode = NULL; + /* entities of runtime functions */ ir_entity_ptr rts_entities[rts_max]; @@ -144,6 +143,7 @@ static void rts_map(void) { } mapper[] = { /* integer */ { &rts_entities[rts_abs], i_mapper_abs }, + { &rts_entities[rts_alloca], i_mapper_alloca }, { &rts_entities[rts_labs], i_mapper_abs }, { &rts_entities[rts_llabs], i_mapper_abs }, { &rts_entities[rts_imaxabs], i_mapper_abs }, @@ -221,7 +221,7 @@ static void rts_map(void) { i_record rec[sizeof(mapper)/sizeof(mapper[0])]; unsigned i, n_map; - for (i = n_map = 0; i < sizeof(mapper)/sizeof(mapper[0]); ++i) + for (i = n_map = 0; i < sizeof(mapper)/sizeof(mapper[0]); ++i) { if (*mapper[i].ent != NULL) { rec[n_map].i_call.kind = INTRINSIC_CALL; rec[n_map].i_call.i_ent = *mapper[i].ent; @@ -229,7 +229,8 @@ static void rts_map(void) { rec[n_map].i_call.ctx = NULL; rec[n_map].i_call.link = NULL; ++n_map; - } /* if */ + } /* if */ + } if (n_map > 0) lower_intrinsics(rec, n_map, /* part_block_used=*/0); } /* rts_map */ @@ -388,12 +389,26 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "reassoc"); CHECK_ONE(firm_opt.check_all, irg); + compute_doms(irg); + CHECK_ONE(firm_opt.check_all, irg); + + if (firm_opt.code_place) { + timer_push(TV_CODE_PLACE); + set_opt_global_cse(1); + optimize_graph_df(irg); + place_code(irg); + set_opt_global_cse(0); + timer_pop(); + DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "place"); + CHECK_ONE(firm_opt.check_all, irg); + } + if (firm_opt.confirm) { /* Confirm construction currently can only handle blocks with only one control flow predecessor. Calling optimize_cf here removes Bad predecessors and help the optimization of switch constructs. */ timer_push(TV_CF_OPT); - optimize_cf(irg); + optimize_cf(irg); timer_pop(); DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt"); CHECK_ONE(firm_opt.check_all, irg); @@ -402,25 +417,11 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi timer_pop(); DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "confirms"); CHECK_ONE(firm_opt.check_all, irg); - } - timer_push(TV_LOCAL_OPT); - optimize_graph_df(irg); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "lopt"); - CHECK_ONE(firm_opt.check_all, irg); - - compute_doms(irg); - CHECK_ONE(firm_opt.check_all, irg); - - if (firm_opt.code_place) { - timer_push(TV_CODE_PLACE); - set_opt_global_cse(1); + timer_push(TV_LOCAL_OPT); optimize_graph_df(irg); - place_code(irg); - set_opt_global_cse(0); timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "place"); + DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "lopt"); CHECK_ONE(firm_opt.check_all, irg); } @@ -436,13 +437,6 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt"); CHECK_ONE(firm_opt.check_all, irg); - /* should we really remove the Confirm here? */ - if (firm_opt.confirm) { - timer_push(TV_CONFIRM_CREATE); - remove_confirms(irg); - timer_pop(); - } - irg_verify(irg, VRFY_ENFORCE_SSA); if (firm_opt.gvn_pre) { do_gvn_pre(irg); @@ -457,7 +451,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi timer_pop(); DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "ldst"); CHECK_ONE(firm_opt.check_all, irg); - } + } lower_highlevel_graph(irg, firm_opt.lower_bitfields); @@ -477,6 +471,13 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi CHECK_ONE(firm_opt.check_all, irg); } + /* should we really remove the Confirm here? */ + if (firm_opt.confirm) { + timer_push(TV_CONFIRM_CREATE); + remove_confirms(irg); + timer_pop(); + } + compute_doms(irg); compute_postdoms(irg); DUMP_ONE_CFG_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "dom"); @@ -552,6 +553,23 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi CHECK_ALL(firm_opt.check_all); } + if (firm_opt.cond_eval) { + for (i = 0; i < get_irp_n_irgs(); i++) { + irg = get_irp_irg(i); + timer_push(TV_COND_EVAL); + opt_cond_eval(irg); + timer_pop(); + DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cond_eval"); + CHECK_ONE(firm_opt.check_all, irg); + + timer_push(TV_CF_OPT); + optimize_cf(irg); + timer_pop(); + DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt"); + CHECK_ONE(firm_opt.check_all, irg); + } + } + if (firm_dump.ir_graph) { /* recompute backedges for nicer dumps */ for (i = 0; i < get_irp_n_irgs(); i++) @@ -828,6 +846,12 @@ static void do_firm_lowering(const char *input_filename) CHECK_ONE(firm_opt.check_all, current_ir_graph); } + /* enable architecture dependent optimizations */ + arch_dep_set_opts((arch_dep_opts_t) + ((firm_opt.muls ? arch_dep_mul_to_shift : arch_dep_none) | + (firm_opt.divs ? arch_dep_div_by_const : arch_dep_none) | + (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); @@ -931,9 +955,17 @@ void gen_firm_init(void) params.cc_mask = 0; /* no regparam, cdecl */ params.builtin_dbg = NULL; -#ifdef FIRM_BACKEND + #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) { - const backend_params *be_params = be_init(); + const backend_params *be_params = be_get_backend_param(); firm_opt.lower_ll = (a_byte) be_params->do_dw_lowering; params.arch_op_settings = be_params->arch_op_settings; @@ -943,17 +975,11 @@ void gen_firm_init(void) ad_param = be_params->dep_param; if_conv_info = be_params->if_conv_info; - } -#endif /* FIRM_BACKEND */ -#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 + if (be_params->has_imm_fp_mode) + firm_imm_fp_mode = be_params->imm_fp_mode; + } - init_firm(¶ms); dbg_init(NULL, NULL, dbg_snprint); edges_init_dbg(firm_opt.vrfy_edges); //cbackend_set_debug_retrieve(dbg_retrieve); @@ -1056,6 +1082,12 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm /* all graphs are finalized, set the irp phase to high */ set_irp_phase_state(phase_high); + /* BEWARE: kill unreachable code before doing compound lowering */ + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { + ir_graph *irg = get_irp_irg(i); + optimize_cf(irg); + } + /* lower all compound call return values */ lower_compound_params(); @@ -1109,13 +1141,6 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm ext_grs_simd_opt(); #endif - /* enable architecture dependent optimizations */ - arch_dep_set_opts((arch_dep_opts_t) - ((firm_opt.muls ? arch_dep_mul_to_shift : arch_dep_none) | - (firm_opt.divs ? arch_dep_div_by_const : arch_dep_none) | - (firm_opt.mods ? arch_dep_mod_by_const : arch_dep_none) )); - - if (firm_dump.statistic & STAT_FINAL_IR) stat_dump_snapshot(input_filename, "final-ir"); @@ -1136,9 +1161,7 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm * Do very early initializations */ void firm_early_init(void) { -#ifdef FIRM_BACKEND /* arg: need this here for command line options */ be_opt_register(); -#endif firm_init_options(NULL, 0, NULL); } /* firm_early_init */