#include "set.h"
#include "hashptr.h"
#include "debug.h"
-#include "statev.h"
+#include "statev_t.h"
#include "dfs_t.h"
#include "absgraph.h"
#define MAX_INT_FREQ 1000000
-typedef struct freq_t {
- double freq;
-} freq_t;
-
-static ir_nodehashmap_t freq_map;
-static struct obstack obst;
-static hook_entry_t hook;
+static hook_entry_t hook;
double get_block_execfreq(const ir_node *block)
{
- const freq_t *freq = ir_nodehashmap_get(freq_t, &freq_map, block);
- if (freq == NULL)
- return 0.0;
- return freq->freq;
+ return block->attr.block.execfreq;
}
void set_block_execfreq(ir_node *block, double newfreq)
{
- freq_t *freq = ir_nodehashmap_get(freq_t, &freq_map, block);
- if (freq == NULL) {
- freq = OALLOC(&obst, freq_t);
- ir_nodehashmap_insert(&freq_map, block, freq);
- }
- freq->freq = newfreq;
+ block->attr.block.execfreq = newfreq;
}
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));
+ double freq = get_block_execfreq(irn);
+ if (freq != 0.0)
+ fprintf(f, "execution frequency: %g\n", freq);
}
void init_execfreq(void)
{
- ir_nodehashmap_init(&freq_map);
- obstack_init(&obst);
-
memset(&hook, 0, sizeof(hook));
hook.hook._hook_node_info = exec_freq_node_info;
register_hook(hook_node_info, &hook);
void exit_execfreq(void)
{
unregister_hook(hook_node_info, &hook);
-
- obstack_free(&obst, NULL);
- ir_nodehashmap_destroy(&freq_map);
}
assure_irg_properties(irg,
IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES
- | IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO);
+ | IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO
+ | IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE);
/* compute a DFS.
* using a toposort on the CFG (without back edges) will propagate
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) ... */
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 */