X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=driver%2Ffirm_opt.c;h=1314336a1056791e0f408a209fab3e279adf4de9;hb=875418c7e5f409c4bf503f749ede8f9c1d8e7996;hp=5c0a2e23e21890481cb953f3bed72a4d209dfc93;hpb=3c5f9d869ac8cc6de6b7c24e0debb537dd3924e3;p=cparser diff --git a/driver/firm_opt.c b/driver/firm_opt.c index 5c0a2e2..1314336 100644 --- a/driver/firm_opt.c +++ b/driver/firm_opt.c @@ -20,6 +20,10 @@ #include "firm_cmdline.h" #include "firm_timing.h" +#ifdef _WIN32 +#define snprintf _snprintf +#endif + #if defined(_DEBUG) || defined(FIRM_DEBUG) #define DBG(x) dbg_printf x #else @@ -288,6 +292,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi ir_graph *irg; unsigned aa_opt; + /* FIXME: cloning might ADD new graphs. */ irg_dump_no = calloc(get_irp_last_idx(), sizeof(*irg_dump_no)); set_opt_strength_red(firm_opt.strength_red); @@ -337,7 +342,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi if (firm_opt.func_calls) { timer_push(TV_REAL_FUNC_CALL); - optimize_funccalls(firm_const_exists); + optimize_funccalls(firm_const_exists, NULL); timer_pop(); DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, "func_call"); CHECK_ALL(firm_opt.check_all); @@ -351,6 +356,9 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi CHECK_ALL(firm_opt.check_all); } + /* do lowering on the const code irg */ + lower_const_code(); + for (i = 0; i < get_irp_n_irgs(); i++) { irg = current_ir_graph = get_irp_irg(i); @@ -425,6 +433,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi if (firm_opt.luffig) { opt_ldst2(irg); DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "ldst2"); + CHECK_ONE(firm_opt.check_all, irg); } timer_push(TV_CF_OPT); @@ -448,14 +457,6 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi irg_verify(irg, VRFY_ENFORCE_SSA); } - if (firm_opt.loop_unrolling) { - timer_push(TV_LOOP_UNROLL); - optimize_loop_unrolling(irg); - timer_pop(); - DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "loop"); - CHECK_ONE(firm_opt.check_all, irg); - } - if (firm_opt.load_store) { timer_push(TV_LOAD_STORE); optimize_load_store(irg); @@ -519,7 +520,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi } timer_push(TV_OSR); - opt_osr(current_ir_graph, osr_flag_default /*| osr_flag_ignore_x86_shift*/); + opt_osr(current_ir_graph, osr_flag_default | osr_flag_keep_reg_pressure | osr_flag_ignore_x86_shift); timer_pop(); DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "stred"); CHECK_ONE(firm_opt.check_all, irg); @@ -541,6 +542,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi if (firm_opt.cloning) { proc_cloning((float)firm_opt.clone_threshold); DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, "clone"); + CHECK_ALL(firm_opt.check_all); } if (firm_dump.ir_graph) { @@ -712,24 +714,14 @@ static int compute_type_size(ir_type *ty) } /* compute_type_size */ /** - * layout all types of the Firm graph + * layout all non-frame types of the Firm graph */ static void compute_type_sizes(void) { int i; ir_type *tp; - ir_graph *irg; - /* all frame types */ - for (i = get_irp_n_irgs() - 1; i >= 0; --i) { - irg = get_irp_irg(i); - /* do not optimize away variables in debug mode */ - if (firm_opt.debug_mode == DBG_MODE_NONE) - opt_frame_irg(irg); - compute_type_size(get_irg_frame_type(irg)); - } - - /* all other types */ + /* all non-frame other types */ for (i = get_irp_n_types() - 1; i >= 0; --i) { tp = get_irp_type(i); compute_type_size(tp); @@ -745,6 +737,24 @@ static void compute_type_sizes(void) } } /* compute_type_sizes */ +/** + * layout all frame-types of the Firm graph + */ +static void compute_frame_type_sizes(void) +{ + int i; + ir_graph *irg; + + /* all frame types */ + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { + irg = get_irp_irg(i); + /* do not optimize away variables in debug mode */ + if (firm_opt.debug_mode == DBG_MODE_NONE) + opt_frame_irg(irg); + compute_type_size(get_irg_frame_type(irg)); + } +} /* compute_frame_type_sizes */ + /** * do Firm lowering * @@ -873,10 +883,8 @@ static void do_firm_lowering(const char *input_filename) DUMP_ALL(firm_dump.ir_graph, "-low-opt"); } -#if 0 if (firm_opt.cc_opt) mark_private_methods(); -#endif /* set the phase to low */ for (i = get_irp_n_irgs() - 1; i >= 0; --i) @@ -946,6 +954,9 @@ void gen_firm_init(void) set_opt_precise_exc_context(firm_opt.precise_exc); set_opt_fragile_ops(firm_opt.fragile_ops); + /* Sel node cannot produce NULL pointers */ + set_opt_sel_based_null_check_elim(1); + /* dynamic dispatch works currently only if whole world scenarios */ set_opt_dyn_meth_dispatch(0); @@ -1044,6 +1055,12 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm /* computes the sizes of all types that are still not computed */ compute_type_sizes(); + /* lower copyb nodes */ + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { + ir_graph *irg = get_irp_irg(i); + lower_CopyB(irg, 128, 4); + } + if (firm_dump.statistic & STAT_BEFORE_OPT) { stat_dump_snapshot(input_filename, "noopt"); } @@ -1061,6 +1078,9 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm if (firm_opt.lower) do_firm_lowering(input_filename); + /* computes the sizes of all frame types */ + compute_frame_type_sizes(); + /* set the phase to low */ for (i = get_irp_n_irgs() - 1; i >= 0; --i) set_irg_phase_low(get_irp_irg(i));