X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fstat%2Ffirmstat.c;h=853a8b5dedb282e960cd86080db338d929dd4d13;hb=38249b0311df91904bb3a566a770efe650f40efc;hp=2bef6616b2a6b2aac1544c21496c3a604414b5fb;hpb=d7f0007010f61a0a59e46934fbf0f04b6bca1283;p=libfirm diff --git a/ir/stat/firmstat.c b/ir/stat/firmstat.c index 2bef6616b..853a8b5de 100644 --- a/ir/stat/firmstat.c +++ b/ir/stat/firmstat.c @@ -23,9 +23,7 @@ * @author Michael Beck * @version $Id$ */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif +#include "config.h" #ifdef FIRM_STATISTICS @@ -73,6 +71,9 @@ static ir_op _op_ModC; /** The Div by Const node. */ static ir_op _op_DivModC; +/** The Quot by Const node. */ +static ir_op _op_QuotC; + /** The memory Proj node. */ static ir_op _op_ProjM; @@ -96,7 +97,7 @@ static ir_op _op_SelSelSel; /** * global status */ -static const int status_disable = 0; +static const unsigned status_disable = 0; static stat_info_t *status = (stat_info_t *)&status_disable; /** @@ -564,34 +565,40 @@ static ir_op *stat_get_irn_op(ir_node *node) } /* if */ break; case iro_Mul: - if (get_irn_op(get_Mul_left(node)) == op_Const || get_irn_op(get_Mul_right(node)) == op_Const) { + if (is_Const(get_Mul_left(node)) || is_Const(get_Mul_right(node))) { /* special case, a Multiply by a const, count on extra counter */ op = status->op_MulC ? status->op_MulC : op; } /* if */ break; case iro_Div: - if (get_irn_op(get_Div_right(node)) == op_Const) { + if (is_Const(get_Div_right(node))) { /* special case, a division by a const, count on extra counter */ op = status->op_DivC ? status->op_DivC : op; } /* if */ break; case iro_Mod: - if (get_irn_op(get_Mod_right(node)) == op_Const) { + if (is_Const(get_Mod_right(node))) { /* special case, a module by a const, count on extra counter */ op = status->op_ModC ? status->op_ModC : op; } /* if */ break; case iro_DivMod: - if (get_irn_op(get_DivMod_right(node)) == op_Const) { + if (is_Const(get_DivMod_right(node))) { /* special case, a division/modulo by a const, count on extra counter */ op = status->op_DivModC ? status->op_DivModC : op; } /* if */ break; + case iro_Quot: + if (is_Const(get_Quot_right(node))) { + /* special case, a floating point division by a const, count on extra counter */ + op = status->op_QuotC ? status->op_QuotC : op; + } /* if */ + break; case iro_Sel: - if (get_irn_op(get_Sel_ptr(node)) == op_Sel) { + if (is_Sel(get_Sel_ptr(node))) { /* special case, a Sel of a Sel, count on extra counter */ op = status->op_SelSel ? status->op_SelSel : op; - if (get_irn_op(get_Sel_ptr(get_Sel_ptr(node))) == op_Sel) { + if (is_Sel(get_Sel_ptr(get_Sel_ptr(node)))) { /* special case, a Sel of a Sel of a Sel, count on extra counter */ op = status->op_SelSelSel ? status->op_SelSelSel : op; } /* if */ @@ -713,7 +720,7 @@ static void update_extbb_info(ir_node *node, graph_entry_t *graph) cnt_inc(&eb_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); @@ -795,7 +802,7 @@ static void stat_update_call(ir_node *call, graph_entry_t *graph) /* found a call, this function is not a leaf */ graph->is_leaf = 0; - if (get_irn_op(ptr) == op_SymConst) { + if (is_SymConst(ptr)) { if (get_SymConst_kind(ptr) == symconst_addr_ent) { /* ok, we seems to know the entity */ ent = get_SymConst_entity(ptr); @@ -863,7 +870,7 @@ static void stat_update_call_2(ir_node *call, graph_entry_t *graph) if (is_Bad(block)) return; - if (get_irn_op(ptr) == op_SymConst) { + if (is_SymConst(ptr)) { if (get_SymConst_kind(ptr) == symconst_addr_ent) { /* ok, we seems to know the entity */ ent = get_SymConst_entity(ptr); @@ -961,7 +968,7 @@ static void update_node_stat(ir_node *node, void *env) node_entry_t *entry; ir_op *op = stat_get_irn_op(node); - int arity = get_irn_arity(node); + int i, arity = get_irn_arity(node); entry = opcode_get_entry(op, graph->opcode_hash); @@ -980,12 +987,6 @@ static void update_node_stat(ir_node *node, void *env) /* handle statistics for special node types */ switch (op->code) { - case iro_Const: - if (status->stat_options & FIRMSTAT_COUNT_CONSTS) { - /* check properties of constants */ - stat_update_const(status, node, graph); - } /* if */ - break; case iro_Call: /* check for properties that depends on calls like recursion/leaf/indirect call */ stat_update_call(node, graph); @@ -998,9 +999,33 @@ static void update_node_stat(ir_node *node, void *env) /* check address properties */ stat_update_address(get_Store_ptr(node), graph); break; + case iro_Phi: + /* check for non-strict Phi nodes */ + for (i = arity - 1; i >= 0; --i) { + ir_node *pred = get_Phi_pred(node, i); + if (is_Unknown(pred)) { + /* found an Unknown predecessor, graph is not strict */ + graph->is_strict = 0; + break; + } + } default: ; } /* switch */ + + /* we want to count the constant IN nodes, not the CSE'ed constant's itself */ + if (status->stat_options & FIRMSTAT_COUNT_CONSTS) { + int i; + + for (i = get_irn_arity(node) - 1; i >= 0; --i) { + ir_node *pred = get_irn_n(node, i); + + if (is_Const(pred)) { + /* check properties of constants */ + stat_update_const(status, pred, graph); + } /* if */ + } /* for */ + } /* if */ } /* update_node_stat */ /** @@ -1169,6 +1194,7 @@ static void update_graph_stat(graph_entry_t *global, graph_entry_t *graph) graph->is_leaf_call = LCS_UNKNOWN; graph->is_recursive = 0; graph->is_chain_call = 1; + graph->is_strict = 1; /* create new block counter */ graph->block_hash = new_pset(block_cmp, 5); @@ -1282,15 +1308,13 @@ static void update_graph_stat_2(graph_entry_t *global, graph_entry_t *graph) * Register a dumper. */ static void stat_register_dumper(const dumper_t *dumper) { - dumper_t *p = xmalloc(sizeof(*p)); + dumper_t *p = XMALLOC(dumper_t); - if (p) { - memcpy(p, dumper, sizeof(*p)); + memcpy(p, dumper, sizeof(*p)); - p->next = status->dumper; - p->status = status; - status->dumper = p; - } + p->next = status->dumper; + p->status = status; + status->dumper = p; /* FIXME: memory leak */ } /* stat_register_dumper */ @@ -1535,6 +1559,7 @@ static void stat_new_graph(void *ctx, ir_graph *irg, ir_entity *ent) { graph->is_leaf_call = 0; graph->is_recursive = 0; graph->is_chain_call = 0; + graph->is_strict = 1; graph->is_analyzed = 0; } STAT_LEAVE; @@ -1644,14 +1669,15 @@ static void stat_irg_block_walk(void *ctx, ir_graph *irg, ir_node *node, generic * @param kind the optimization kind */ 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); + opt_entry_t *entry; + ir_op *op = stat_get_irn_op(n); /* ignore CSE for Constants */ if (kind == HOOK_OPT_CSE && (is_Const(n) || is_SymConst(n))) return; /* increase global value */ + entry = opt_get_entry(op, hmap); cnt_inc(&entry->count); } /* removed_due_opt */ @@ -2168,8 +2194,7 @@ void firm_init_stat(unsigned enable_options) if (! (enable_options & FIRMSTAT_ENABLED)) return; - status = xmalloc(sizeof(*status)); - memset(status, 0, sizeof(*status)); + status = XMALLOCZ(stat_info_t); /* enable statistics */ status->stat_options = enable_options & FIRMSTAT_ENABLED ? enable_options : 0; @@ -2230,6 +2255,9 @@ void firm_init_stat(unsigned enable_options) _op_DivModC.code = --num; _op_DivModC.name = new_id_from_chars(X("DivModC")); + _op_QuotC.code = --num; + _op_QuotC.name = new_id_from_chars(X("QuotC")); + status->op_Phi0 = &_op_Phi0; status->op_PhiM = &_op_PhiM; status->op_ProjM = &_op_ProjM; @@ -2237,6 +2265,7 @@ void firm_init_stat(unsigned enable_options) status->op_DivC = &_op_DivC; status->op_ModC = &_op_ModC; status->op_DivModC = &_op_DivModC; + status->op_QuotC = &_op_QuotC; } else { status->op_Phi0 = NULL; status->op_PhiM = NULL; @@ -2245,6 +2274,7 @@ void firm_init_stat(unsigned enable_options) status->op_DivC = NULL; status->op_ModC = NULL; status->op_DivModC = NULL; + status->op_QuotC = NULL; } /* if */ /* for Florian: count the Sel depth */