- else if(arch_irn_classify(aenv, irn) & arch_irn_class_copy)
- ++env->stat->n_copies;
-
- else if(arch_irn_classify(aenv, irn) & arch_irn_class_perm)
- ++env->stat->n_perms;
- }
-
- /* a mem phi is a PhiM with a mem phi operand or a Spill operand */
- else if(is_Phi(irn) && get_irn_mode(irn) == mode_M) {
- int i;
-
- for(i = get_irn_arity(irn) - 1; i >= 0; --i) {
- ir_node *op = get_irn_n(irn, i);
-
- if((is_Phi(op) && bitset_contains_irn(env->mem_phis, op)) || (arch_irn_classify(aenv, op) & arch_irn_class_spill)) {
- bitset_add_irn(env->mem_phis, irn);
- env->stat->n_mem_phis++;
- break;
- }
- }
- }
-}
-
-static void node_stats(be_irg_t *birg, const arch_register_class_t *cls, node_stat_t *stat)
-{
- struct node_stat_walker env;
-
- memset(stat, 0, sizeof(stat[0]));
- env.arch_env = birg->main_env->arch_env;
- env.mem_phis = bitset_irg_malloc(birg->irg);
- env.stat = stat;
- env.cls = cls;
- irg_walk_graph(birg->irg, NULL, node_stat_walker, &env);
- bitset_free(env.mem_phis);
-}
-
-static void insn_count_walker(ir_node *irn, void *data)
-{
- int *cnt = data;
-
- switch(get_irn_opcode(irn)) {
- case iro_Proj:
- case iro_Phi:
- case iro_Start:
- case iro_End:
- break;
- default:
- (*cnt)++;
- }
-}
-
-static unsigned int count_insns(ir_graph *irg)
-{
- int cnt = 0;
- irg_walk_graph(irg, insn_count_walker, NULL, &cnt);
- return cnt;
-}
-
-/**
- * Initialize all timers.
- */
-static void be_init_timer(be_options_t *main_opts)
-{
- if (main_opts->timing == BE_TIME_ON) {
- ra_timer.t_prolog = lc_timer_register("ra_prolog", "regalloc prolog");
- ra_timer.t_epilog = lc_timer_register("ra_epilog", "regalloc epilog");
- ra_timer.t_live = lc_timer_register("ra_liveness", "be liveness");
- ra_timer.t_spill = lc_timer_register("ra_spill", "spiller");
- ra_timer.t_spillslots = lc_timer_register("ra_spillslots", "spillslots");
- ra_timer.t_color = lc_timer_register("ra_color", "graph coloring");
- ra_timer.t_ifg = lc_timer_register("ra_ifg", "interference graph");
- ra_timer.t_copymin = lc_timer_register("ra_copymin", "copy minimization");
- ra_timer.t_ssa = lc_timer_register("ra_ssadestr", "ssa destruction");
- ra_timer.t_verify = lc_timer_register("ra_verify", "graph verification");
- ra_timer.t_other = lc_timer_register("ra_other", "other time");
-
- LC_STOP_AND_RESET_TIMER(ra_timer.t_prolog);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_epilog);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_live);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_spill);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_spillslots);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_color);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_ifg);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_copymin);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_ssa);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_verify);
- LC_STOP_AND_RESET_TIMER(ra_timer.t_other);
-
- global_ra_timer = &ra_timer;
- }
-}
-
-#define BE_TIMER_INIT(main_opts) be_init_timer(main_opts)
-
-#define BE_TIMER_PUSH(timer) \
- if (main_opts->timing == BE_TIME_ON) { \
- if (! lc_timer_push(timer)) { \
- if (options.vrfy_option == BE_CH_VRFY_ASSERT) \
- assert(!"Timer already on stack, cannot be pushed twice."); \
- else if (options.vrfy_option == BE_CH_VRFY_WARN) \
- fprintf(stderr, "Timer %s already on stack, cannot be pushed twice.\n", \
- lc_timer_get_name(timer)); \
- } \
- }
-#define BE_TIMER_POP(timer) \
- if (main_opts->timing == BE_TIME_ON) { \
- lc_timer_t *tmp = lc_timer_pop(); \
- if (options.vrfy_option == BE_CH_VRFY_ASSERT) \
- assert(tmp == timer && "Attempt to pop wrong timer."); \
- else if (options.vrfy_option == BE_CH_VRFY_WARN && tmp != timer) \
- fprintf(stderr, "Attempt to pop wrong timer. %s is on stack, trying to pop %s.\n", \
- lc_timer_get_name(tmp), lc_timer_get_name(timer)); \
- timer = tmp; \
- }