Remove unnecessary return; at end of void functions.
[libfirm] / ir / stat / firmstat.c
index eacad20..2bef661 100644 (file)
@@ -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 */