experiment with new emitter style, change assembler syntax of ia32 backend to AT&T
[libfirm] / ir / be / bestat.c
index 486fad8..9cdbad6 100644 (file)
@@ -8,8 +8,6 @@
 #include "config.h"
 #endif
 
-#ifdef FIRM_STATISTICS
-
 #include <time.h>
 
 #include "irnode_t.h"
@@ -26,6 +24,8 @@
 #include "besched.h"
 #include "benode_t.h"
 
+#ifdef FIRM_STATISTICS
+
 typedef struct _be_stat_irg_t {
        ir_graph         *irg;       /**< the irg, the statistic is about */
        pset             *phases;    /**< node statistics for each phase  */
@@ -173,7 +173,7 @@ void be_do_stat_permcycle(const char *class_name, ir_node *perm, ir_node *block,
 static void do_nodes_stat(ir_node *irn, void *env) {
        be_stat_phase_t  *phase = env;
        ir_mode          *mode;
-       opcode           opc;
+       ir_opcode        opc;
        arch_irn_class_t irn_class;
 
        if (is_Block(irn))
@@ -302,16 +302,46 @@ void be_stat_init_irg(const arch_env_t *arch_env, ir_graph *irg) {
                }
        }
 }
+#endif
 
-const char *be_stat_tags[STAT_TAG_LAST];
+typedef struct _estimate_irg_costs_env_t {
+       const arch_env_t *arch_env;
+       ir_exec_freq *execfreqs;
+       double costs;
+} estimate_irg_costs_env_t;
+
+static void estimate_block_costs(ir_node *block, void *data)
+{
+       estimate_irg_costs_env_t *env = data;
+       ir_node *node;
+       double costs = 0;
+
+       sched_foreach(block, node) {
+               costs += arch_get_op_estimated_cost(env->arch_env, node);
+       }
 
+       env->costs += costs * get_block_execfreq(env->execfreqs, block);
+}
+
+double be_estimate_irg_costs(ir_graph *irg, const arch_env_t *arch_env, ir_exec_freq *execfreqs)
+{
+       estimate_irg_costs_env_t env;
+       env.arch_env = arch_env;
+       env.execfreqs = execfreqs;
+       env.costs = 0;
+
+       irg_block_walk_graph(irg, estimate_block_costs, NULL, &env);
+
+       return env.costs;
+}
+
+#ifdef FIRM_STATISTICS
+const char *be_stat_tags[STAT_TAG_LAST];
 FILE *be_stat_file = NULL;
 
-void be_init_stat_file(const char *stat_file_name, ir_graph *irg)
+void be_init_stat_file(const char *stat_file_name, const char *sourcefilename)
 {
-       unsigned line;
        static char time_str[32];
-       static char irg_name[128];
 
        assert(be_stat_file == NULL);
 
@@ -327,11 +357,10 @@ void be_init_stat_file(const char *stat_file_name, ir_graph *irg)
 
        /* initialize the statistics tags */
        ir_snprintf(time_str, sizeof(time_str),"%u", time(NULL));
-       ir_snprintf(irg_name, sizeof(irg_name), "%F", irg);
 
-       be_stat_tags[STAT_TAG_FILE] = be_retrieve_dbg_info(get_entity_dbg_info(get_irg_entity(irg)), &line);
+       be_stat_tags[STAT_TAG_FILE] = sourcefilename;
        be_stat_tags[STAT_TAG_TIME] = time_str;
-       be_stat_tags[STAT_TAG_IRG]  = irg_name;
+       be_stat_tags[STAT_TAG_IRG]  = "<all>";
        be_stat_tags[STAT_TAG_CLS]  = "<all>";
 
        be_stat_ev_push(be_stat_tags, STAT_TAG_LAST, be_stat_file);