X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=driver%2Ffirm_opt.c;h=8d3d3fa2ec30f4f859043252632aa39a44fcd1fa;hb=ed07e4be99cb6911f67a3de7d9034b375c7e9886;hp=1314336a1056791e0f408a209fab3e279adf4de9;hpb=9a2fa0297379908605bafee1aaa9ac4c7ffb227e;p=cparser diff --git a/driver/firm_opt.c b/driver/firm_opt.c index 1314336..8d3d3fa 100644 --- a/driver/firm_opt.c +++ b/driver/firm_opt.c @@ -331,13 +331,16 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi CHECK_ALL(firm_opt.check_all); } - if (firm_opt.tail_rec) { - timer_push(TV_TAIL_REC); - opt_tail_recursion(); + /* first step: kill dead code */ + for (i = 0; i < get_irp_n_irgs(); i++) { + irg = current_ir_graph = get_irp_irg(i); + /* 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_graph_df(irg); + optimize_cf(irg); timer_pop(); - - DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, "tail_rec"); - CHECK_ALL(firm_opt.check_all); } if (firm_opt.func_calls) { @@ -348,21 +351,12 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi CHECK_ALL(firm_opt.check_all); } - if (firm_opt.do_inline) { - timer_push(TV_INLINE); - inline_leave_functions(500, 80, 30, FALSE); - timer_pop(); - DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, "inl"); - 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); - #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) @@ -539,11 +533,24 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi CHECK_ONE(firm_opt.check_all, irg); } + if (firm_opt.do_inline) { + inline_functions(500, 50); + DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, "inl"); + CHECK_ALL(firm_opt.check_all); + } 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_opt.tail_rec) { + timer_push(TV_TAIL_REC); + opt_tail_recursion(); + timer_pop(); + + DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, "tail_rec"); + CHECK_ALL(firm_opt.check_all); + } if (firm_dump.ir_graph) { /* recompute backedges for nicer dumps */ @@ -570,8 +577,10 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi DUMP_ALL(firm_dump.ir_graph, "-opt"); /* verify optimized graphs */ - for (i = get_irp_n_irgs() - 1; i >= 0; --i) - irg_verify(get_irp_irg(i), VRFY_ENFORCE_SSA); + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { + ir_graph *irg = get_irp_irg(i); + irg_verify(irg, VRFY_ENFORCE_SSA); + } if (firm_dump.statistic & STAT_AFTER_OPT) stat_dump_snapshot(input_filename, "opt"); @@ -790,7 +799,6 @@ static void do_firm_lowering(const char *input_filename) } timer_push(TV_DW_LOWER); lower_dw_ops(&init); - DUMP_ALL(firm_dump.ir_graph, "-dw"); timer_pop(); } @@ -842,7 +850,6 @@ static void do_firm_lowering(const char *input_filename) CHECK_ONE(firm_opt.check_all, current_ir_graph); } -// set_opt_global_cse(0); timer_push(TV_LOAD_STORE); optimize_load_store(current_ir_graph); timer_pop();