const block_entry_t *e1 = elt;
const block_entry_t *e2 = key;
+ /* it's enough to compare the block number */
return e1->block_nr != e2->block_nr;
} /* block_cmp */
static void graph_clear_entry(graph_entry_t *elem, int all) {
int i;
- /* clear accumulated / non-acumulated counter */
+ /* clear accumulated / non-accumulated counter */
for (i = all ? 0 : _gcnt_non_acc; i < _gcnt_last; ++i) {
cnt_clr(&elem->cnt[i]);
} /* for */
if (op == op_Block) {
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 */
+ if (node == get_irg_start_block(graph->irg))
+ b_entry->is_start = 1;
+ else if (node == get_irg_end_block(graph->irg))
+ b_entry->is_end = 1;
/* count all incoming edges */
for (i = 0; i < arity; ++i) {
cnt_inc(&b_entry->cnt[bcnt_nodes]);
/* don't count keep-alive edges */
- if (get_irn_op(node) == op_End)
+ if (is_End(node))
return;
arity = get_irn_arity(node);
/* it is recursive, if it calls at least once */
if (callee == graph->irg)
graph->is_recursive = 1;
+ if (callee == NULL)
+ cnt_inc(&graph->cnt[gcnt_external_calls]);
} /* if */
} else {
/* indirect call, be could not predict */
} /* if */
/* check, if it's a chain-call: Then, the call-block
- * must dominate the end block. */
+ * must dominate the end block. */
{
ir_node *curr = get_irg_end_block(graph->irg);
int depth = get_Block_dom_depth(block);
*
* @param n the IR node that will be removed
* @param hmap the hash map containing ir_op* -> opt_entry_t*
+ * @param kind the optimization kind
*/
-static void removed_due_opt(ir_node *n, hmap_opt_entry_t *hmap) {
+static void removed_due_opt(ir_node *n, hmap_opt_entry_t *hmap, hook_opt_kind kind) {
ir_op *op = stat_get_irn_op(n);
opt_entry_t *entry = opt_get_entry(op, hmap);
+ /* ignore CSE for Constants */
+ if (kind == HOOK_OPT_CSE && (is_Const(n) || is_SymConst(n)))
+ return;
+
/* increase global value */
cnt_inc(&entry->count);
} /* removed_due_opt */
xopt = HOOK_OPT_CONFIRM_C;
} /* if */
- removed_due_opt(old_node_array[i], graph->opt_hash[xopt]);
+ removed_due_opt(old_node_array[i], graph->opt_hash[xopt], xopt);
} /* if */
} /* for */
}
{
graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
- removed_due_opt(node, graph->opt_hash[HOOK_LOWERED]);
+ removed_due_opt(node, graph->opt_hash[HOOK_LOWERED], HOOK_LOWERED);
}
STAT_LEAVE;
} /* stat_lower */
graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
cnt_inc(&graph->cnt[gcnt_acc_strength_red]);
- removed_due_opt(strong, graph->opt_hash[HOOK_OPT_STRENGTH_RED]);
+ removed_due_opt(strong, graph->opt_hash[HOOK_OPT_STRENGTH_RED], HOOK_OPT_STRENGTH_RED);
}
STAT_LEAVE;
} /* stat_strength_red */
STAT_ENTER;
{
graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
- removed_due_opt(mul, graph->opt_hash[HOOK_OPT_ARCH_DEP]);
+ removed_due_opt(mul, graph->opt_hash[HOOK_OPT_ARCH_DEP], HOOK_OPT_ARCH_DEP);
}
STAT_LEAVE;
} /* stat_arch_dep_replace_mul_with_shifts */
STAT_ENTER;
{
graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
- removed_due_opt(node, graph->opt_hash[HOOK_OPT_ARCH_DEP]);
+ removed_due_opt(node, graph->opt_hash[HOOK_OPT_ARCH_DEP], HOOK_OPT_ARCH_DEP);
}
STAT_LEAVE;
} /* stat_arch_dep_replace_division_by_const */