dump(DUMP_INITIAL, irg, "-begin", dump_ir_block_graph);
- be_stat_init_irg(env->arch_env, irg);
- be_do_stat_nodes(irg, "01 Begin");
-
/* set the current graph (this is important for several firm functions) */
current_ir_graph = irg;
be_timing = (be_options.timing == BE_TIME_ON);
if (be_timing) {
- t_abi = ir_timer_register("time_beabi", "be abi introduction");
- t_codegen = ir_timer_register("time_codegen", "codegeneration");
- t_sched = ir_timer_register("time_sched", "scheduling");
- t_constr = ir_timer_register("time_constr", "assure constraints");
- t_finish = ir_timer_register("time_finish", "graph finish");
- t_emit = ir_timer_register("time_emiter", "code emiter");
- t_verify = ir_timer_register("time_verify", "graph verification");
- t_other = ir_timer_register("time_other", "other");
- t_heights = ir_timer_register("time_heights", "heights");
- t_live = ir_timer_register("time_liveness", "be liveness");
- t_execfreq = ir_timer_register("time_execfreq", "execfreq");
- t_ssa_constr = ir_timer_register("time_ssa_constr", "ssa reconstruction");
- t_ra_prolog = ir_timer_register("time_ra_prolog", "regalloc prolog");
- t_ra_epilog = ir_timer_register("time_ra_epilog", "regalloc epilog");
- t_ra_constr = ir_timer_register("time_ra_constr", "regalloc constraints");
- t_ra_spill = ir_timer_register("time_ra_spill", "spiller");
+ t_abi = ir_timer_register("bemain_time_beabi", "be abi introduction");
+ t_codegen = ir_timer_register("bemain_time_codegen", "codegeneration");
+ t_sched = ir_timer_register("bemain_time_sched", "scheduling");
+ t_constr = ir_timer_register("bemain_time_constr", "assure constraints");
+ t_finish = ir_timer_register("bemain_time_finish", "graph finish");
+ t_emit = ir_timer_register("bemain_time_emiter", "code emiter");
+ t_verify = ir_timer_register("bemain_time_verify", "graph verification");
+ t_other = ir_timer_register("bemain_time_other", "other");
+ t_heights = ir_timer_register("bemain_time_heights", "heights");
+ t_live = ir_timer_register("bemain_time_liveness", "be liveness");
+ t_execfreq = ir_timer_register("bemain_time_execfreq", "execfreq");
+ t_ssa_constr = ir_timer_register("bemain_time_ssa_constr", "ssa reconstruction");
+ t_ra_prolog = ir_timer_register("bemain_time_ra_prolog", "regalloc prolog");
+ t_ra_epilog = ir_timer_register("bemain_time_ra_epilog", "regalloc epilog");
+ t_ra_constr = ir_timer_register("bemain_time_ra_constr", "regalloc constraints");
+ t_ra_spill = ir_timer_register("bemain_time_ra_spill", "spiller");
t_ra_spill_apply
- = ir_timer_register("time_ra_spill_apply", "apply spills");
- t_ra_color = ir_timer_register("time_ra_color", "graph coloring");
- t_ra_ifg = ir_timer_register("time_ra_ifg", "interference graph");
- t_ra_copymin = ir_timer_register("time_ra_copymin", "copy minimization");
- t_ra_ssa = ir_timer_register("time_ra_ssadestr", "ssa destruction");
- t_ra_other = ir_timer_register("time_ra_other", "regalloc other");
+ = ir_timer_register("bemain_time_ra_spill_apply", "apply spills");
+ t_ra_color = ir_timer_register("bemain_time_ra_color", "graph coloring");
+ t_ra_ifg = ir_timer_register("bemain_time_ra_ifg", "interference graph");
+ t_ra_copymin = ir_timer_register("bemain_time_ra_copymin", "copy minimization");
+ t_ra_ssa = ir_timer_register("bemain_time_ra_ssadestr", "ssa destruction");
+ t_ra_other = ir_timer_register("bemain_time_ra_other", "regalloc other");
}
be_init_env(&env, file_handle);
arch_env = env.arch_env;
- /* backend may provide an ordered list of irgs where code should be generated for */
+ /* backend may provide an ordered list of irgs where code should be
+ * generated for */
irg_list = NEW_ARR_F(ir_graph *, 0);
backend_irg_list = arch_env_get_backend_irg_list(arch_env, &irg_list);
/* set the current graph (this is important for several firm functions) */
current_ir_graph = irg;
-#if 0
- {
- unsigned percent = 100*i/num_birgs;
- ir_printf("%u.%02u %+F\n", percent/100, percent%100, irg);
- }
-#endif
be_sched_init_phase(irg);
/* reset the phi handler. */
be_phi_handler_reset();
- stat_ev_ctx_push_fobj("bemain_irg", irg);
+ stat_ev_if {
+ stat_ev_ctx_push_fobj("bemain_irg", irg);
+ be_stat_ev("bemain_insns_start", be_count_insns(irg));
+ be_stat_ev("bemain_blocks_start", be_count_blocks(irg));
+ }
/* stop and reset timers */
BE_TIMER_PUSH(t_other); /* t_other */
BE_TIMER_POP(t_abi);
dump(DUMP_ABI, irg, "-abi", dump_ir_block_graph);
- be_do_stat_nodes(irg, "02 Abi");
if (be_options.vrfy_option == BE_VRFY_WARN) {
be_check_dominance(irg);
}
/* generate code */
- stat_ev_ctx_push_str("bemain_phase", "prepare");
BE_TIMER_PUSH(t_codegen);
arch_code_generator_prepare_graph(birg->cg);
BE_TIMER_POP(t_codegen);
- stat_ev_ctx_pop("bemain_phase");
/* reset the phi handler. */
be_phi_handler_reset();
- be_do_stat_nodes(irg, "03 Prepare");
-
dump(DUMP_PREPARED, irg, "-prepared", dump_ir_block_graph);
if (be_options.vrfy_option == BE_VRFY_WARN) {
*/
if (ir_profile_has_data())
birg->exec_freq = ir_create_execfreqs_from_profile(irg);
- else
+ else {
+ /* TODO: edges are corrupt for EDGE_KIND_BLOCK after the local
+ * optimize graph phase merges blocks in the x86 backend */
+ edges_deactivate(irg);
birg->exec_freq = compute_execfreq(irg, 10);
+ }
BE_TIMER_POP(t_execfreq);
/* be_live_chk_compare(birg); */
/* let backend prepare scheduling */
- stat_ev_ctx_push_str("bemain_phase", "before_sched");
BE_TIMER_PUSH(t_codegen);
arch_code_generator_before_sched(birg->cg);
BE_TIMER_POP(t_codegen);
- stat_ev_ctx_pop("bemain_phase");
/* schedule the irg */
BE_TIMER_PUSH(t_sched);
be_sched_vrfy(birg, be_options.vrfy_option);
BE_TIMER_POP(t_verify);
- be_do_stat_nodes(irg, "04 Schedule");
-
/* introduce patterns to assure constraints */
BE_TIMER_PUSH(t_constr);
/* we switch off optimizations here, because they might cause trouble */
set_opt_normalize(0);
set_opt_cse(0);
- assert(!get_opt_cse());
-
/* add Keeps for should_be_different constrained nodes */
/* beware: needs schedule due to usage of be_ssa_constr */
assure_constraints(birg);
BE_TIMER_POP(t_constr);
dump(DUMP_SCHED, irg, "-assured", dump_ir_block_graph_sched);
- be_do_stat_nodes(irg, "05 Constraints");
/* stuff needs to be done after scheduling but before register allocation */
BE_TIMER_PUSH(t_codegen);
be_sched_vrfy(birg, be_options.vrfy_option);
BE_TIMER_POP(t_verify);
- /* do some statistics */
- //be_do_stat_reg_pressure(birg);
-
-#ifdef FIRM_STATISTICS
- stat_ev_dbl("costs_before_ra", be_estimate_irg_costs(irg, arch_env, birg->exec_freq));
-#endif
+ stat_ev_if {
+ stat_ev_dbl("bemain_costs_before_ra",
+ be_estimate_irg_costs(irg, arch_env, birg->exec_freq));
+ be_stat_ev("bemain_insns_before_ra", be_count_insns(irg));
+ be_stat_ev("bemain_blocks_before_ra", be_count_blocks(irg));
+ }
/* Do register allocation */
be_allocate_registers(birg);
#ifdef FIRM_STATISTICS
- stat_ev_dbl("costs_before_ra", be_estimate_irg_costs(irg, arch_env, birg->exec_freq));
+ stat_ev_dbl("bemain_costs_before_ra", be_estimate_irg_costs(irg, arch_env, birg->exec_freq));
#endif
dump(DUMP_RA, irg, "-ra", dump_ir_block_graph_sched);
- be_do_stat_nodes(irg, "06 Register Allocation");
/* let the code generator prepare the graph for emitter */
BE_TIMER_PUSH(t_finish);
dump(DUMP_FINAL, irg, "-finish", dump_ir_block_graph_sched);
+ stat_ev_if {
+ be_stat_ev("bemain_insns_finish", be_count_insns(irg));
+ be_stat_ev("bemain_blocks_finish", be_count_blocks(irg));
+ }
+
/* check schedule and register allocation */
BE_TIMER_PUSH(t_verify);
if (be_options.vrfy_option == BE_VRFY_WARN) {
be_abi_free(birg->abi);
BE_TIMER_POP(t_abi);
- be_do_stat_nodes(irg, "07 Final");
restore_optimization_state(&state);
BE_TIMER_POP(t_other);
be_sched_free_phase(irg);
be_free_birg(birg);
-
- /* switched off due to statistics (statistic module needs all irgs) */
-#if 0 /* STA needs irgs */
-#ifdef FIRM_STATISTICS
- if (! stat_is_active())
-#endif /* FIRM_STATISTICS */
- free_ir_graph(irg);
-#endif /* if 0 */
stat_ev_ctx_pop("bemain_irg");
}
ir_profile_free();
be_options.statev = 1;
stat_ev_begin(buf, be_options.filtev);
+ stat_ev_ctx_push_str("bemain_compilation_unit", cup_name);
}
#endif
ir_timer_stop(t);
ir_timer_leave_high_priority();
stat_ev_if {
- stat_ev_dbl("backend_time", ir_timer_elapsed_msec(t));
+ stat_ev_dbl("bemain_backend_time", ir_timer_elapsed_msec(t));
} else {
printf("%-20s: %lu msec\n", "BEMAINLOOP", ir_timer_elapsed_msec(t));
}
}
#ifdef FIRM_STATISTICS
- if (be_options.statev)
+ if (be_options.statev) {
+ stat_ev_ctx_pop("bemain_compilation_unit");
stat_ev_end();
+ }
#endif
}