fix bugs in execfreq rework commit
authorMatthias Braun <matthias.braun@kit.edu>
Wed, 1 Aug 2012 16:20:18 +0000 (18:20 +0200)
committerMatthias Braun <matthias.braun@kit.edu>
Thu, 2 Aug 2012 14:17:13 +0000 (16:17 +0200)
ir/ana/execfreq.c
ir/be/betranshlp.c

index be752dd..519d90c 100644 (file)
@@ -90,7 +90,9 @@ static void exec_freq_node_info(void *ctx, FILE *f, const ir_node *irn)
        (void)ctx;
        if (!is_Block(irn))
                return;
-       fprintf(f, "execution frequency: %g\n", get_block_execfreq(irn));
+       const freq_t *freq = ir_nodehashmap_get(freq_t, &freq_map, irn);
+       if (freq != NULL)
+               fprintf(f, "execution frequency: %g\n", get_block_execfreq(irn));
 }
 
 void init_execfreq(void)
@@ -272,7 +274,7 @@ void ir_estimate_execfreq(ir_graph *irg)
 
        ir_node *end_block = get_irg_end_block(irg);
 
-       for (int idx = dfs_get_n_nodes(dfs) - 1; idx >= 0; --idx) {
+       for (int idx = size - 1; idx >= 0; --idx) {
                const ir_node *bb = (ir_node*)dfs_get_post_num_node(dfs, size-idx-1);
 
                /* Sum of (execution frequency of predecessor * probability of cf edge) ... */
@@ -330,7 +332,7 @@ void ir_estimate_execfreq(ir_graph *irg)
        double start_freq = x[start_idx];
        double norm       = start_freq != 0.0 ? 1.0 / start_freq : 1.0;
 
-       for (int idx = dfs_get_n_nodes(dfs) - 1; idx >= 0; --idx) {
+       for (int idx = size - 1; idx >= 0; --idx) {
                ir_node *bb = (ir_node *) dfs_get_post_num_node(dfs, size - idx - 1);
 
                /* take abs because it sometimes can be -0 in case of endless loops */
index c1023f0..24feebe 100644 (file)
@@ -37,6 +37,7 @@
 #include "trouts.h"
 #include "cgana.h"
 #include "debug.h"
+#include "execfreq_t.h"
 
 #include "beirg.h"
 #include "beabi.h"
@@ -114,6 +115,10 @@ static ir_node *transform_block(ir_node *node)
        copy_node_attr(irg, node, block);
        block->node_nr = node->node_nr;
 
+       /* transfer execfreq value */
+       double execfreq = get_block_execfreq(node);
+       set_block_execfreq(block, execfreq);
+
        /* put the preds in the worklist */
        be_enqueue_preds(node);