X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fstat%2Ffirmstat.c;h=2bef6616b2a6b2aac1544c21496c3a604414b5fb;hb=8428d50114020cce61e2fccae4e23244a99db918;hp=eacad20d2c99fd38abf93a9aff513f58ce0a71be;hpb=9baf0cd6e299828073f897e4bd0a284379ad9cdb;p=libfirm diff --git a/ir/stat/firmstat.c b/ir/stat/firmstat.c index eacad20d2..2bef6616b 100644 --- a/ir/stat/firmstat.c +++ b/ir/stat/firmstat.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -136,6 +136,7 @@ static int block_cmp(const void *elt, const void *key) { const block_entry_t *e1 = elt; const block_entry_t *e2 = key; + /* it's enough to compare the block number */ return e1->block_nr != e2->block_nr; } /* block_cmp */ @@ -259,7 +260,7 @@ static ir_op *opcode_find_entry(ir_opcode code, hmap_ir_op *hmap) { static void graph_clear_entry(graph_entry_t *elem, int all) { int i; - /* clear accumulated / non-acumulated counter */ + /* clear accumulated / non-accumulated counter */ for (i = all ? 0 : _gcnt_non_acc; i < _gcnt_last; ++i) { cnt_clr(&elem->cnt[i]); } /* for */ @@ -526,6 +527,15 @@ static perm_stat_entry_t *perm_stat_get_entry(struct obstack *obst, ir_node *per return pset_insert(hmap, elem, HASH_PTR(perm)); } /* perm_stat_get_entry */ +/** + * Clear optimizations counter, + */ +static void clear_optimization_counter(void) { + int i; + for (i = 0; i < FS_OPT_MAX; ++i) + cnt_clr(&status->num_opts[i]); +} + /** * Returns the ir_op for an IR-node, * handles special cases and return pseudo op codes. @@ -608,6 +618,11 @@ static void undate_block_info(ir_node *node, graph_entry_t *graph) if (op == op_Block) { arity = get_irn_arity(node); b_entry = block_get_entry(&graph->recalc_cnts, get_irn_node_nr(node), graph->block_hash); + /* mark start end block to allow to filter them out */ + if (node == get_irg_start_block(graph->irg)) + b_entry->is_start = 1; + else if (node == get_irg_end_block(graph->irg)) + b_entry->is_end = 1; /* count all incoming edges */ for (i = 0; i < arity; ++i) { @@ -633,7 +648,7 @@ static void undate_block_info(ir_node *node, graph_entry_t *graph) cnt_inc(&b_entry->cnt[bcnt_nodes]); /* don't count keep-alive edges */ - if (get_irn_op(node) == op_End) + if (is_End(node)) return; arity = get_irn_arity(node); @@ -789,6 +804,8 @@ static void stat_update_call(ir_node *call, graph_entry_t *graph) /* it is recursive, if it calls at least once */ if (callee == graph->irg) graph->is_recursive = 1; + if (callee == NULL) + cnt_inc(&graph->cnt[gcnt_external_calls]); } /* if */ } else { /* indirect call, be could not predict */ @@ -799,7 +816,7 @@ static void stat_update_call(ir_node *call, graph_entry_t *graph) } /* if */ /* check, if it's a chain-call: Then, the call-block - * must dominate the end block. */ + * must dominate the end block. */ { ir_node *curr = get_irg_end_block(graph->irg); int depth = get_Block_dom_depth(block); @@ -1325,10 +1342,22 @@ static void stat_dump_param_tbl(const distrib_tbl_t *tbl, graph_entry_t *global) dumper_t *dumper; for (dumper = status->dumper; dumper; dumper = dumper->next) { - if (dumper->dump_const_tbl) + if (dumper->dump_param_tbl) dumper->dump_param_tbl(dumper, tbl, global); } /* for */ -} +} /* stat_dump_param_tbl */ + +/** + * Dumps the optimization counter + */ +static void stat_dump_opt_cnt(const counter_t *tbl, unsigned len) { + dumper_t *dumper; + + for (dumper = status->dumper; dumper; dumper = dumper->next) { + if (dumper->dump_opt_cnt) + dumper->dump_opt_cnt(dumper, tbl, len); + } /* for */ +} /* stat_dump_opt_cnt */ /** * Initialize the dumper. @@ -1612,11 +1641,16 @@ static void stat_irg_block_walk(void *ctx, ir_graph *irg, ir_node *node, generic * * @param n the IR node that will be removed * @param hmap the hash map containing ir_op* -> opt_entry_t* + * @param kind the optimization kind */ -static void removed_due_opt(ir_node *n, hmap_opt_entry_t *hmap) { +static void removed_due_opt(ir_node *n, hmap_opt_entry_t *hmap, hook_opt_kind kind) { ir_op *op = stat_get_irn_op(n); opt_entry_t *entry = opt_get_entry(op, hmap); + /* ignore CSE for Constants */ + if (kind == HOOK_OPT_CSE && (is_Const(n) || is_SymConst(n))) + return; + /* increase global value */ cnt_inc(&entry->count); } /* removed_due_opt */ @@ -1641,6 +1675,7 @@ static void stat_merge_nodes( int i, j; graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash); + cnt_inc(&status->num_opts[opt]); if (status->reassoc_run) opt = HOOK_OPT_REASSOC; @@ -1662,7 +1697,7 @@ static void stat_merge_nodes( xopt = HOOK_OPT_CONFIRM_C; } /* if */ - removed_due_opt(old_node_array[i], graph->opt_hash[xopt]); + removed_due_opt(old_node_array[i], graph->opt_hash[xopt], xopt); } /* if */ } /* for */ } @@ -1702,7 +1737,7 @@ static void stat_lower(void *ctx, ir_node *node) { { graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash); - removed_due_opt(node, graph->opt_hash[HOOK_LOWERED]); + removed_due_opt(node, graph->opt_hash[HOOK_LOWERED], HOOK_LOWERED); } STAT_LEAVE; } /* stat_lower */ @@ -1767,7 +1802,7 @@ static void stat_strength_red(void *ctx, ir_graph *irg, ir_node *strong) { graph_entry_t *graph = graph_get_entry(irg, status->irg_hash); cnt_inc(&graph->cnt[gcnt_acc_strength_red]); - removed_due_opt(strong, graph->opt_hash[HOOK_OPT_STRENGTH_RED]); + removed_due_opt(strong, graph->opt_hash[HOOK_OPT_STRENGTH_RED], HOOK_OPT_STRENGTH_RED); } STAT_LEAVE; } /* stat_strength_red */ @@ -1840,7 +1875,7 @@ static void stat_arch_dep_replace_mul_with_shifts(void *ctx, ir_node *mul) { STAT_ENTER; { graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash); - removed_due_opt(mul, graph->opt_hash[HOOK_OPT_ARCH_DEP]); + removed_due_opt(mul, graph->opt_hash[HOOK_OPT_ARCH_DEP], HOOK_OPT_ARCH_DEP); } STAT_LEAVE; } /* stat_arch_dep_replace_mul_with_shifts */ @@ -1859,7 +1894,7 @@ static void stat_arch_dep_replace_division_by_const(void *ctx, ir_node *node) { STAT_ENTER; { graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash); - removed_due_opt(node, graph->opt_hash[HOOK_OPT_ARCH_DEP]); + removed_due_opt(node, graph->opt_hash[HOOK_OPT_ARCH_DEP], HOOK_OPT_ARCH_DEP); } STAT_LEAVE; } /* stat_arch_dep_replace_division_by_const */ @@ -2097,6 +2132,10 @@ void stat_dump_snapshot(const char *name, const char *phase) /* dump the parameter distribution */ stat_dump_param_tbl(status->dist_param_cnt, global); + /* dump the optimization counter and clear them */ + stat_dump_opt_cnt(status->num_opts, ARR_SIZE(status->num_opts)); + clear_optimization_counter(); + stat_dump_finish(); stat_finish_pattern_history(fname); @@ -2239,6 +2278,8 @@ void firm_init_stat(unsigned enable_options) /* distribution table for parameter counts */ status->dist_param_cnt = stat_new_int_distrib_tbl(); + clear_optimization_counter(); + #undef HOOK #undef X } /* firm_init_stat */