projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed some bugs in the pop generation, still not all
[libfirm]
/
ir
/
stat
/
firmstat.c
diff --git
a/ir/stat/firmstat.c
b/ir/stat/firmstat.c
index
bd2fcbb
..
2bef661
100644
(file)
--- a/
ir/stat/firmstat.c
+++ b/
ir/stat/firmstat.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (C) 1995-200
7
University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-200
8
University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
*
* This file is part of libFirm.
*
@@
-136,6
+136,7
@@
static int block_cmp(const void *elt, const void *key) {
const block_entry_t *e1 = elt;
const block_entry_t *e2 = key;
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 */
return e1->block_nr != e2->block_nr;
} /* block_cmp */
@@
-259,7
+260,7
@@
static ir_op *opcode_find_entry(ir_opcode code, hmap_ir_op *hmap) {
static void graph_clear_entry(graph_entry_t *elem, int all) {
int i;
static void graph_clear_entry(graph_entry_t *elem, int all) {
int i;
- /* clear accumulated / non-acumulated counter */
+ /* clear accumulated / non-ac
c
umulated counter */
for (i = all ? 0 : _gcnt_non_acc; i < _gcnt_last; ++i) {
cnt_clr(&elem->cnt[i]);
} /* for */
for (i = all ? 0 : _gcnt_non_acc; i < _gcnt_last; ++i) {
cnt_clr(&elem->cnt[i]);
} /* for */
@@
-617,6
+618,11
@@
static void undate_block_info(ir_node *node, graph_entry_t *graph)
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);
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) {
/* count all incoming edges */
for (i = 0; i < arity; ++i) {
@@
-642,7
+648,7
@@
static void undate_block_info(ir_node *node, graph_entry_t *graph)
cnt_inc(&b_entry->cnt[bcnt_nodes]);
/* don't count keep-alive edges */
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);
return;
arity = get_irn_arity(node);
@@
-798,6
+804,8
@@
static void stat_update_call(ir_node *call, graph_entry_t *graph)
/* it is recursive, if it calls at least once */
if (callee == graph->irg)
graph->is_recursive = 1;
/* 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 */
} else {
/* indirect call, be could not predict */
@@
-808,7
+816,7
@@
static void stat_update_call(ir_node *call, graph_entry_t *graph)
} /* if */
/* check, if it's a chain-call: Then, the call-block
} /* 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);
{
ir_node *curr = get_irg_end_block(graph->irg);
int depth = get_Block_dom_depth(block);
@@
-1633,11
+1641,16
@@
static void stat_irg_block_walk(void *ctx, ir_graph *irg, ir_node *node, generic
*
* @param n the IR node that will be removed
* @param hmap the hash map containing ir_op* -> opt_entry_t*
*
* @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);
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 */
/* increase global value */
cnt_inc(&entry->count);
} /* removed_due_opt */
@@
-1684,7
+1697,7
@@
static void stat_merge_nodes(
xopt = HOOK_OPT_CONFIRM_C;
} /* if */
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 */
}
} /* if */
} /* for */
}
@@
-1724,7
+1737,7
@@
static void stat_lower(void *ctx, ir_node *node) {
{
graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
{
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 */
}
STAT_LEAVE;
} /* stat_lower */
@@
-1789,7
+1802,7
@@
static void stat_strength_red(void *ctx, ir_graph *irg, ir_node *strong) {
graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
cnt_inc(&graph->cnt[gcnt_acc_strength_red]);
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_LEAVE;
} /* stat_strength_red */
@@
-1862,7
+1875,7
@@
static void stat_arch_dep_replace_mul_with_shifts(void *ctx, ir_node *mul) {
STAT_ENTER;
{
graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
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_LEAVE;
} /* stat_arch_dep_replace_mul_with_shifts */
@@
-1881,7
+1894,7
@@
static void stat_arch_dep_replace_division_by_const(void *ctx, ir_node *node) {
STAT_ENTER;
{
graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
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 */
}
STAT_LEAVE;
} /* stat_arch_dep_replace_division_by_const */