--status->in_dead_node_elim;
}
+/**
+ * if-conversion was tried
+ */
+static void stat_if_conversion(void *context, ir_graph *irg, ir_node *phi,
+ int pos, ir_node *mux, if_result_t reason)
+{
+ if (! status->stat_options)
+ return;
+
+ STAT_ENTER;
+ {
+ graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
+
+ cnt_inc(&graph->cnt_if_conv[reason]);
+ }
+ STAT_LEAVE;
+}
+
/**
* A multiply was replaced by a series of Shifts/Adds/Subs
*
HOOK(hook_strength_red, stat_strength_red);
HOOK(hook_dead_node_elim_start, stat_dead_node_elim_start);
HOOK(hook_dead_node_elim_stop, stat_dead_node_elim_stop);
+ HOOK(hook_if_conversion, stat_if_conversion);
HOOK(hook_arch_dep_replace_mul_with_shifts, stat_arch_dep_replace_mul_with_shifts);
HOOK(hook_arch_dep_replace_div_by_const, stat_arch_dep_replace_div_by_const);
HOOK(hook_arch_dep_replace_mod_by_const, stat_arch_dep_replace_mod_by_const);
* An entry for ir_graphs. These numbers are calculated for every IR graph.
*/
typedef struct _graph_entry_t {
- HASH_MAP(node_entry_t) *opcode_hash; /**< hash map containing the opcode counter */
- HASH_MAP(block_entry_t) *block_hash; /**< hash map containing the block counter */
- counter_t cnt_walked; /**< walker walked over the graph */
- counter_t cnt_walked_blocks; /**< walker walked over the graph blocks */
- counter_t cnt_was_inlined; /**< number of times other graph were inlined */
- counter_t cnt_got_inlined; /**< number of times this graph was inlined */
- counter_t cnt_strength_red; /**< number of times strength reduction was successful on this graph */
- counter_t cnt_edges; /**< number of DF edges in this graph */
- counter_t cnt_all_calls; /**< number of all calls */
- counter_t cnt_call_with_cnst_arg; /**< number of calls with const args */
- counter_t cnt_indirect_calls; /**< number of indirect calls */
- HASH_MAP(opt_entry_t) *opt_hash[HOOK_OPT_LAST]; /**< hash maps containing opcode counter for optimizations */
- ir_graph *irg; /**< the graph of this object */
- entity *ent; /**< the entity of this graph if one exists */
- set *address_mark; /**< a set containing the address marks of the nodes */
- unsigned is_deleted:1; /**< set if this irg was deleted */
- unsigned is_leaf:1; /**< set, if this irg is a leaf function */
- unsigned is_leaf_call:2; /**< set, if this irg calls only leaf functions */
- unsigned is_recursive:1; /**< set, if this irg has recursive calls */
- unsigned is_chain_call:1; /**< set, if this irg is a chain call */
- unsigned is_analyzed:1; /**< helper: set, if this irg was already analysed */
+ HASH_MAP(node_entry_t) *opcode_hash; /**< hash map containing the opcode counter */
+ HASH_MAP(block_entry_t) *block_hash; /**< hash map containing the block counter */
+ counter_t cnt_walked; /**< walker walked over the graph */
+ counter_t cnt_walked_blocks; /**< walker walked over the graph blocks */
+ counter_t cnt_was_inlined; /**< number of times other graph were inlined */
+ counter_t cnt_got_inlined; /**< number of times this graph was inlined */
+ counter_t cnt_strength_red; /**< number of times strength reduction was successful on this graph */
+ counter_t cnt_edges; /**< number of DF edges in this graph */
+ counter_t cnt_all_calls; /**< number of all calls */
+ counter_t cnt_call_with_cnst_arg; /**< number of calls with const args */
+ counter_t cnt_indirect_calls; /**< number of indirect calls */
+ counter_t cnt_if_conv[IF_RESULT_LAST]; /**< number of if conversions */
+ HASH_MAP(opt_entry_t) *opt_hash[HOOK_OPT_LAST]; /**< hash maps containing opcode counter for optimizations */
+ ir_graph *irg; /**< the graph of this object */
+ entity *ent; /**< the entity of this graph if one exists */
+ set *address_mark; /**< a set containing the address marks of the nodes */
+ unsigned is_deleted:1; /**< set if this irg was deleted */
+ unsigned is_leaf:1; /**< set, if this irg is a leaf function */
+ unsigned is_leaf_call:2; /**< set, if this irg calls only leaf functions */
+ unsigned is_recursive:1; /**< set, if this irg has recursive calls */
+ unsigned is_chain_call:1; /**< set, if this irg is a chain call */
+ unsigned is_analyzed:1; /**< helper: set, if this irg was already analysed */
} graph_entry_t;
/**
"Architecture dependant optimization",
"Reassociation optimization",
"Polymorphic call optimization",
+ "an if conversion was tried",
"Lowered",
};
+static const char *if_conv_names[] = {
+ "if conv done :",
+ "if conv side effect :",
+ "if conv Phi node found :",
+ "if conv to deep DAG's :",
+ "if conv bad control flow :",
+};
+
/**
* dumps a opcode hash into human readable form
*/
*/
static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
{
- int dump_opts = 1;
+ int i, dump_opts = 1;
block_entry_t *b_entry;
if (entry->irg) {
entry->cnt_walked.cnt[0], entry->cnt_walked_blocks.cnt[0],
entry->cnt_was_inlined.cnt[0],
entry->cnt_got_inlined.cnt[0],
- entry->cnt_strength_red.cnt[0],
- entry->is_leaf ? "YES" : "NO",
- entry->is_leaf_call == LCS_NON_LEAF_CALL ? "NO" : (entry->is_leaf_call == LCS_LEAF_CALL ? "Yes" : "Maybe"),
- entry->is_recursive ? "YES" : "NO",
- entry->is_chain_call ? "YES" : "NO",
+ entry->cnt_strength_red.cnt[0],
+ entry->is_leaf ? "YES" : "NO",
+ entry->is_leaf_call == LCS_NON_LEAF_CALL ? "NO" : (entry->is_leaf_call == LCS_LEAF_CALL ? "Yes" : "Maybe"),
+ entry->is_recursive ? "YES" : "NO",
+ entry->is_chain_call ? "YES" : "NO",
entry->cnt_all_calls.cnt[0],
entry->cnt_indirect_calls.cnt[0]
);
+
+ for (i = 0; i < sizeof(entry->cnt_if_conv)/sizeof(entry->cnt_if_conv[0]); ++i) {
+ fprintf(dmp->f, " %s : %u\n", if_conv_names[i], entry->cnt_if_conv[i].cnt[0]);
+ }
+
}
else {
fprintf(dmp->f, "\nGlobals counts:\n");