* @file
* @brief Statistics for Firm.
* @author Michael Beck
- * @version $Id$
*/
#include "config.h"
#include "xmalloc.h"
#include "irhooks.h"
#include "util.h"
+#include "ircons.h"
/*
* need this to be static:
} /* opt_cmp */
/**
- * Compare two elements of the block/extbb hash.
+ * Compare two elements of the block hash.
*/
static int block_cmp(const void *elt, const void *key)
{
elem->block_hash = NULL;
} /* if */
- if (elem->extbb_hash) {
- del_pset(elem->extbb_hash);
- elem->extbb_hash = NULL;
- } /* if */
-
obstack_free(&elem->recalc_cnts, NULL);
obstack_init(&elem->recalc_cnts);
} /* graph_clear_entry */
key.irg = irg;
- elem = (graph_entry_t*)pset_find(hmap, &key, HASH_PTR(irg));
+ elem = (graph_entry_t*)pset_find(hmap, &key, hash_ptr(irg));
if (elem) {
/* create hash map backend block information */
/* these hash tables are created on demand */
elem->block_hash = NULL;
- elem->extbb_hash = NULL;
- for (i = 0; i < sizeof(elem->opt_hash)/sizeof(elem->opt_hash[0]); ++i)
+ for (i = 0; i != ARRAY_SIZE(elem->opt_hash); ++i)
elem->opt_hash[i] = new_pset(opt_cmp, 4);
- return (graph_entry_t*)pset_insert(hmap, elem, HASH_PTR(irg));
+ return (graph_entry_t*)pset_insert(hmap, elem, hash_ptr(irg));
} /* graph_get_entry */
/**
key.class_name = class_name;
- elem = (perm_class_entry_t*)pset_find(hmap, &key, HASH_PTR(class_name));
+ elem = (perm_class_entry_t*)pset_find(hmap, &key, hash_ptr(class_name));
if (elem)
return elem;
elem->class_name = class_name;
- return (perm_class_entry_t*)pset_insert(hmap, elem, HASH_PTR(class_name));
+ return (perm_class_entry_t*)pset_insert(hmap, elem, hash_ptr(class_name));
} /* perm_class_get_entry */
/**
key.perm = perm;
- elem = (perm_stat_entry_t*)pset_find(hmap, &key, HASH_PTR(perm));
+ elem = (perm_stat_entry_t*)pset_find(hmap, &key, hash_ptr(perm));
if (elem)
return elem;
elem->perm = perm;
- return (perm_stat_entry_t*)pset_insert(hmap, elem, HASH_PTR(perm));
+ return (perm_stat_entry_t*)pset_insert(hmap, elem, hash_ptr(perm));
} /* perm_stat_get_entry */
/**
*/
static void undate_block_info(ir_node *node, graph_entry_t *graph)
{
- ir_op *op = get_irn_op(node);
ir_node *block;
block_entry_t *b_entry;
int i, arity;
/* check for block */
- if (op == op_Block) {
+ if (is_Block(node)) {
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 */
block = get_nodes_block(node);
b_entry = block_get_entry(&graph->recalc_cnts, get_irn_node_nr(block), graph->block_hash);
- if (op == op_Phi && mode_is_datab(get_irn_mode(node))) {
+ if (is_Phi(node) && mode_is_datab(get_irn_mode(node))) {
/* count data Phi per block */
cnt_inc(&b_entry->cnt[bcnt_phi_data]);
} /* if */
} /* for */
} /* undate_block_info */
-/**
- * Update the extended block counter.
- */
-static void update_extbb_info(ir_node *node, graph_entry_t *graph)
-{
- ir_op *op = get_irn_op(node);
- ir_extblk *extbb;
- extbb_entry_t *eb_entry;
- int i, arity;
-
- /* check for block */
- if (op == op_Block) {
- extbb = get_nodes_extbb(node);
- arity = get_irn_arity(node);
- eb_entry = block_get_entry(&graph->recalc_cnts, get_extbb_node_nr(extbb), graph->extbb_hash);
-
- /* count all incoming edges */
- for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_n(node, i);
- ir_extblk *other_extbb = get_nodes_extbb(pred);
-
- if (extbb != other_extbb) {
- extbb_entry_t *eb_entry_other = block_get_entry(&graph->recalc_cnts, get_extbb_node_nr(other_extbb), graph->extbb_hash);
-
- cnt_inc(&eb_entry->cnt[bcnt_in_edges]); /* an edge coming from another extbb */
- cnt_inc(&eb_entry_other->cnt[bcnt_out_edges]);
- } /* if */
- } /* for */
- return;
- } /* if */
-
- extbb = get_nodes_extbb(node);
- eb_entry = block_get_entry(&graph->recalc_cnts, get_extbb_node_nr(extbb), graph->extbb_hash);
-
- if (op == op_Phi && mode_is_datab(get_irn_mode(node))) {
- /* count data Phi per extbb */
- cnt_inc(&eb_entry->cnt[bcnt_phi_data]);
- } /* if */
-
- /* we have a new node in our block */
- cnt_inc(&eb_entry->cnt[bcnt_nodes]);
-
- /* don't count keep-alive edges */
- if (is_End(node))
- return;
-
- arity = get_irn_arity(node);
-
- for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_n(node, i);
- ir_extblk *other_extbb = get_nodes_extbb(pred);
-
- if (other_extbb == extbb)
- cnt_inc(&eb_entry->cnt[bcnt_edges]); /* a in extbb edge */
- else {
- extbb_entry_t *eb_entry_other = block_get_entry(&graph->recalc_cnts, get_extbb_node_nr(other_extbb), graph->extbb_hash);
-
- cnt_inc(&eb_entry->cnt[bcnt_in_edges]); /* an edge coming from another extbb */
- cnt_inc(&eb_entry_other->cnt[bcnt_out_edges]);
- } /* if */
- } /* for */
-} /* update_extbb_info */
-
/**
* Calculates how many arguments of the call are const, updates
* param distribution.
/* count block edges */
undate_block_info(node, graph);
- /* count extended block edges */
- if (status->stat_options & FIRMSTAT_COUNT_EXTBB) {
- if (graph->irg != get_const_code_irg())
- update_extbb_info(node, graph);
- } /* if */
-
/* handle statistics for special node types */
switch (op->code) {
*/
static unsigned get_adr_mark(graph_entry_t *graph, ir_node *node)
{
- address_mark_entry_t *value = (address_mark_entry_t*)set_find(graph->address_mark, &node, sizeof(*value), HASH_PTR(node));
+ address_mark_entry_t const val = { node, 0 };
+ address_mark_entry_t *value = set_find(address_mark_entry_t, graph->address_mark, &val, sizeof(val), hash_ptr(node));
return value ? value->mark : 0;
} /* get_adr_mark */
*/
static void set_adr_mark(graph_entry_t *graph, ir_node *node, unsigned val)
{
- address_mark_entry_t *value = (address_mark_entry_t*)set_insert(graph->address_mark, &node, sizeof(*value), HASH_PTR(node));
-
- value->mark = val;
+ address_mark_entry_t const value = { node, val };
+ (void)set_insert(address_mark_entry_t, graph->address_mark, &value, sizeof(value), hash_ptr(node));
} /* set_adr_mark */
#undef DUMP_ADR_MODE
*/
static void update_graph_stat(graph_entry_t *global, graph_entry_t *graph)
{
- node_entry_t *entry;
int i;
/* clear first the alive counter in the graph */
- foreach_pset(graph->opcode_hash, node_entry_t*, entry) {
+ foreach_pset(graph->opcode_hash, node_entry_t, entry) {
cnt_clr(&entry->cnt_alive);
} /* foreach_pset */
/* we need dominator info */
if (graph->irg != get_const_code_irg()) {
assure_doms(graph->irg);
-
- if (status->stat_options & FIRMSTAT_COUNT_EXTBB) {
- /* we need extended basic blocks */
- compute_extbb(graph->irg);
-
- /* create new extbb counter */
- graph->extbb_hash = new_pset(block_cmp, 5);
- } /* if */
} /* if */
/* count the nodes in the graph */
graph->is_chain_call = 0;
/* assume we walk every graph only ONCE, we could sum here the global count */
- foreach_pset(graph->opcode_hash, node_entry_t*, entry) {
+ foreach_pset(graph->opcode_hash, node_entry_t, entry) {
node_entry_t *g_entry = opcode_get_entry(entry->op, global->opcode_hash);
/* update the node counter */
for (dumper = status->dumper; dumper; dumper = dumper->next) {
if (dumper->func_map) {
- dump_graph_FUNC func;
-
foreach_pset(dumper->func_map, dump_graph_FUNC, func)
func(dumper, entry);
} /* if */
/**
* Register an additional function for all dumper.
*/
-void stat_register_dumper_func(dump_graph_FUNC func)
+void stat_register_dumper_func(dump_graph_FUNC *const func)
{
dumper_t *dumper;
*/
ir_op *stat_get_op_from_opcode(unsigned code)
{
- return opcode_find_entry(code, status->ir_op_hash);
+ return opcode_find_entry((ir_opcode)code, status->ir_op_hash);
} /* stat_get_op_from_opcode */
/**
/* sometimes we did not detect, that it is replaced by a Const */
if (opt == HOOK_OPT_CONFIRM && new_num_entries == 1) {
- ir_op *op = get_irn_op(new_node_array[0]);
-
- if (op == op_Const || op == op_SymConst)
+ ir_node *const irn = new_node_array[0];
+ if (is_Const(irn) || is_SymConst(irn))
xopt = HOOK_OPT_CONFIRM_C;
} /* if */
rp_ent->class_name = class_name;
rp_ent->pressure = pressure;
- pset_insert(block_ent->reg_pressure, rp_ent, HASH_PTR(class_name));
+ pset_insert(block_ent->reg_pressure, rp_ent, hash_ptr(class_name));
}
STAT_LEAVE;
} /* stat_be_block_regpressure */
STAT_ENTER;
{
- graph_entry_t *entry;
graph_entry_t *global = graph_get_entry(NULL, status->irg_hash);
/*
stat_dump_init(fname);
/* calculate the graph statistics */
- for (entry = (graph_entry_t*)pset_first(status->irg_hash);
- entry != NULL; entry = (graph_entry_t*)pset_next(status->irg_hash)) {
+ foreach_pset(status->irg_hash, graph_entry_t, entry) {
if (entry->irg == NULL) {
/* special entry for the global count */
continue;
/* some calculations are dependent, we pushed them on the wait_q */
while (! pdeq_empty(status->wait_q)) {
- entry = (graph_entry_t*)pdeq_getr(status->wait_q);
+ graph_entry_t *const entry = (graph_entry_t*)pdeq_getr(status->wait_q);
update_graph_stat_2(global, entry);
} /* while */
/* dump per graph */
- for (entry = (graph_entry_t*)pset_first(status->irg_hash);
- entry != NULL; entry = (graph_entry_t*)pset_next(status->irg_hash)) {
+ foreach_pset(status->irg_hash, graph_entry_t, entry) {
if (entry->irg == NULL) {
/* special entry for the global count */
continue;
stat_finish_pattern_history(fname);
/* clear the global counters here */
- {
- node_entry_t *entry;
-
- for (entry = (node_entry_t*)pset_first(global->opcode_hash);
- entry != NULL; entry = (node_entry_t*)pset_next(global->opcode_hash)) {
- opcode_clear_entry(entry);
- } /* for */
- /* clear all global counter */
- graph_clear_entry(global, /*all=*/1);
- }
+ foreach_pset(global->opcode_hash, node_entry_t, entry) {
+ opcode_clear_entry(entry);
+ } /* for */
+ /* clear all global counter */
+ graph_clear_entry(global, /*all=*/1);
}
STAT_LEAVE;
} /* stat_dump_snapshot */