- detect non-strict functions
[libfirm] / ir / stat / firmstat.c
index e1d6fa1..1e7dd4b 100644 (file)
@@ -597,10 +597,10 @@ static ir_op *stat_get_irn_op(ir_node *node)
                }  /* 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 */
@@ -722,7 +722,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);
@@ -804,7 +804,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);
@@ -872,7 +872,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);
@@ -970,7 +970,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);
 
@@ -1001,6 +1001,16 @@ 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 */
@@ -1186,6 +1196,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);
@@ -1299,15 +1310,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 */
@@ -1552,6 +1561,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;
@@ -1661,14 +1671,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 */
 
@@ -2185,8 +2196,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;