updated Header
[libfirm] / ir / stat / stat_dmp.c
index 7ca6d7f..fd71cca 100644 (file)
@@ -1,12 +1,27 @@
 /*
- * Project:     libFIRM
- * File name:   ir/ir/stat_dmp.c
- * Purpose:     Statistics for Firm.
- * Author:      Michael Beck
- * Created:
- * CVS-ID:      $Id$
- * Copyright:   (c) 2004 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief   Statistics for Firm. Dumping.
+ * @author  Michael Beck
+ * @version $Id$
  */
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -190,8 +205,8 @@ static void simple_dump_be_block_reg_pressure(dumper_t *dmp, graph_entry_t *entr
 
 /** prints a distribution entry */
 static void simple_dump_distrib_entry(const distrib_entry_t *entry, void *env) {
-       FILE *dmp_f = env;
-       fprintf(dmp_f, "%12d", cnt_to_uint(&entry->cnt));
+       dumper_t *dmp = env;
+       fprintf(dmp->f, "%12d", cnt_to_uint(&entry->cnt));
 }  /* simple_dump_distrib_entry */
 
 /**
@@ -213,7 +228,7 @@ static void simple_dump_be_block_sched_ready(dumper_t *dmp, graph_entry_t *entry
                                stat_insert_int_distrib_tbl(b_entry->sched_ready, i);
 
                        fprintf(dmp->f, "BLK   %6ld", b_entry->block_nr);
-                       stat_iterate_distrib_tbl(b_entry->sched_ready, simple_dump_distrib_entry, dmp->f);
+                       stat_iterate_distrib_tbl(b_entry->sched_ready, simple_dump_distrib_entry, dmp);
                        fprintf(dmp->f, "%12.2lf", stat_calc_avg_distrib_tbl(b_entry->sched_ready));
                        fprintf(dmp->f, "\n");
                }  /* foreach_pset */
@@ -398,20 +413,20 @@ static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
                        " calls                     : %u\n"
                        " indirect calls            : %u\n",
                        entry->is_deleted ? "DELETED " : "",
-                       cnt_to_uint(&entry->cnt_walked), cnt_to_uint(&entry->cnt_walked_blocks),
-                       cnt_to_uint(&entry->cnt_was_inlined),
-                       cnt_to_uint(&entry->cnt_got_inlined),
-                       cnt_to_uint(&entry->cnt_strength_red),
+                       cnt_to_uint(&entry->cnt[gcnt_acc_walked]), cnt_to_uint(&entry->cnt[gcnt_acc_walked_blocks]),
+                       cnt_to_uint(&entry->cnt[gcnt_acc_was_inlined]),
+                       cnt_to_uint(&entry->cnt[gcnt_acc_got_inlined]),
+                       cnt_to_uint(&entry->cnt[gcnt_acc_strength_red]),
                        entry->is_leaf ? "YES" : "NO",
                        entry->is_leaf_call == LCS_NON_LEAF_CALL ? "NO" : (entry->is_leaf_call == LCS_LEAF_CALL ? "Yes" : "Maybe"),
                        entry->is_recursive ? "YES" : "NO",
                        entry->is_chain_call ? "YES" : "NO",
-                       cnt_to_uint(&entry->cnt_all_calls),
-                       cnt_to_uint(&entry->cnt_indirect_calls)
+                       cnt_to_uint(&entry->cnt[gcnt_all_calls]),
+                       cnt_to_uint(&entry->cnt[gcnt_indirect_calls])
                );
 
-               for (i = 0; i < sizeof(entry->cnt_if_conv)/sizeof(entry->cnt_if_conv[0]); ++i) {
-                       fprintf(dmp->f, " %s : %u\n", if_conv_names[i], cnt_to_uint(&entry->cnt_if_conv[i]));
+               for (i = 0; i < IF_RESULT_LAST; ++i) {
+                       fprintf(dmp->f, " %s : %u\n", if_conv_names[i], cnt_to_uint(&entry->cnt[gcnt_if_conv + i]));
                }  /* for */
        } else {
                fprintf(dmp->f, "\nGlobals counts:\n");
@@ -423,17 +438,32 @@ static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
        fprintf(dmp->f,
                " pure address calc ops     : %u\n"
                " all address calc ops      : %u\n",
-               cnt_to_uint(&entry->cnt_pure_adr_ops),
-               cnt_to_uint(&entry->cnt_all_adr_ops));
+               cnt_to_uint(&entry->cnt[gcnt_pure_adr_ops]),
+               cnt_to_uint(&entry->cnt[gcnt_all_adr_ops])
+       );
+
+       /* Load/Store address classification */
+       fprintf(dmp->f,
+               " global Ld/St address      : %u\n"
+               " local Ld/St address       : %u\n"
+               " this Ld/St address        : %u\n"
+               " param Ld/St address       : %u\n"
+               " other Ld/St address       : %u\n",
+               cnt_to_uint(&entry->cnt[gcnt_global_adr]),
+               cnt_to_uint(&entry->cnt[gcnt_local_adr]),
+               cnt_to_uint(&entry->cnt[gcnt_this_adr]),
+               cnt_to_uint(&entry->cnt[gcnt_param_adr]),
+               cnt_to_uint(&entry->cnt[gcnt_other_adr])
+       );
 
        simple_dump_opcode_hash(dmp, entry->opcode_hash);
-       simple_dump_edges(dmp, &entry->cnt_edges);
+       simple_dump_edges(dmp, &entry->cnt[gcnt_edges]);
 
        /* effects of optimizations */
        if (dump_opts) {
                int i;
 
-               simple_dump_real_func_calls(dmp, &entry->cnt_real_func_call);
+               simple_dump_real_func_calls(dmp, &entry->cnt[gcnt_acc_real_func_call]);
                simple_dump_tail_recursion(dmp, entry->num_tail_recursion);
 
                for (i = 0; i < sizeof(entry->opt_hash)/sizeof(entry->opt_hash[0]); ++i) {
@@ -445,12 +475,12 @@ static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
                foreach_pset(entry->block_hash, b_entry) {
                        fprintf(dmp->f, "BLK   %6ld %12u %12u %12u %12u %12u %4.8f\n",
                                b_entry->block_nr,
-                               cnt_to_uint(&b_entry->cnt_nodes),
-                               cnt_to_uint(&b_entry->cnt_edges),
-                               cnt_to_uint(&b_entry->cnt_in_edges),
-                               cnt_to_uint(&b_entry->cnt_out_edges),
-                               cnt_to_uint(&b_entry->cnt_phi_data),
-                               cnt_to_dbl(&b_entry->cnt_edges) / cnt_to_dbl(&b_entry->cnt_nodes)
+                               cnt_to_uint(&b_entry->cnt[bcnt_nodes]),
+                               cnt_to_uint(&b_entry->cnt[bcnt_edges]),
+                               cnt_to_uint(&b_entry->cnt[bcnt_in_edges]),
+                               cnt_to_uint(&b_entry->cnt[bcnt_out_edges]),
+                               cnt_to_uint(&b_entry->cnt[bcnt_phi_data]),
+                               cnt_to_dbl(&b_entry->cnt[bcnt_edges]) / cnt_to_dbl(&b_entry->cnt[bcnt_nodes])
                        );
                }  /* foreach_pset */
 
@@ -469,12 +499,12 @@ static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
                        foreach_pset(entry->extbb_hash, eb_entry) {
                                fprintf(dmp->f, "ExtBB %6ld %12u %12u %12u %12u %12u %4.8f\n",
                                        eb_entry->block_nr,
-                                       cnt_to_uint(&eb_entry->cnt_nodes),
-                                       cnt_to_uint(&eb_entry->cnt_edges),
-                                       cnt_to_uint(&eb_entry->cnt_in_edges),
-                                       cnt_to_uint(&eb_entry->cnt_out_edges),
-                                       cnt_to_uint(&eb_entry->cnt_phi_data),
-                                       cnt_to_dbl(&eb_entry->cnt_edges) / cnt_to_dbl(&eb_entry->cnt_nodes)
+                                       cnt_to_uint(&eb_entry->cnt[bcnt_nodes]),
+                                       cnt_to_uint(&eb_entry->cnt[bcnt_edges]),
+                                       cnt_to_uint(&eb_entry->cnt[bcnt_in_edges]),
+                                       cnt_to_uint(&eb_entry->cnt[bcnt_out_edges]),
+                                       cnt_to_uint(&eb_entry->cnt[bcnt_phi_data]),
+                                       cnt_to_dbl(&eb_entry->cnt[bcnt_edges]) / cnt_to_dbl(&eb_entry->cnt[bcnt_nodes])
                                );
                        }  /* foreach_pset */
                }  /* if */
@@ -521,6 +551,31 @@ static void simple_dump_const_tbl(dumper_t *dmp, const constant_info_t *tbl)
        fprintf(dmp->f, "sum   %12u\n", cnt_to_uint(&sum));
 }  /* simple_dump_const_tbl */
 
+/**
+ * Dumps a line of the parameter table
+ */
+static void dump_tbl_line(const distrib_entry_t *entry, void *env) {
+       dumper_t *dmp = env;
+
+       fprintf(dmp->f, "%d : %u\n", PTR_TO_INT(entry->object), cnt_to_uint(&entry->cnt));
+}  /* dump_tbl_line */
+
+/**
+ * dumps the parameter distribution table
+ */
+static void simple_dump_param_tbl(dumper_t *dmp, const distrib_tbl_t *tbl, graph_entry_t *global) {
+       fprintf(dmp->f, "\nCall parameter Information:\n");
+       fprintf(dmp->f, "---------------------\n");
+
+       stat_iterate_distrib_tbl(tbl, dump_tbl_line, dmp);
+       fprintf(dmp->f, "-------------------------------\n");
+
+       fprintf(dmp->f, "Number of Calls           %12u\n", cnt_to_uint(&global->cnt[gcnt_all_calls]));
+       fprintf(dmp->f, "with const params         %12u\n", cnt_to_uint(&global->cnt[gcnt_call_with_cnst_arg]));
+       fprintf(dmp->f, "with all const params     %12u\n", cnt_to_uint(&global->cnt[gcnt_call_with_all_cnst_arg]));
+       fprintf(dmp->f, "with local var adr params %12u\n", cnt_to_uint(&global->cnt[gcnt_call_with_local_adr]));
+}  /* simple_dump_param_tbl */
+
 /**
  * initialize the simple dumper
  */
@@ -549,6 +604,7 @@ static void simple_finish(dumper_t *dmp) {
 const dumper_t simple_dumper = {
        simple_dump_graph,
        simple_dump_const_tbl,
+       simple_dump_param_tbl,
        simple_init,
        simple_finish,
        NULL,
@@ -638,6 +694,13 @@ static void csv_dump_const_tbl(dumper_t *dmp, const constant_info_t *tbl)
        /* FIXME: NYI */
 }  /* csv_dump_const_tbl */
 
+/**
+ * dumps the parameter distribution table
+ */
+static void csv_dump_param_tbl(dumper_t *dmp, const distrib_tbl_t *tbl, graph_entry_t *global) {
+       /* FIXME: NYI */
+}  /* csv_dump_param_tbl */
+
 /**
  * initialize the simple dumper
  */
@@ -667,6 +730,7 @@ static void csv_finish(dumper_t *dmp)
 const dumper_t csv_dumper = {
        csv_dump_graph,
        csv_dump_const_tbl,
+       csv_dump_param_tbl,
        csv_init,
        csv_finish,
        NULL,