Treat conversions between the same size as downconv to get rid of unnecessary convers...
[libfirm] / ir / stat / firmstat.c
index 2bef661..521fa03 100644 (file)
@@ -73,6 +73,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 +99,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 +567,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 +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);
@@ -795,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);
@@ -863,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);
@@ -980,12 +989,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);
@@ -1001,6 +1004,20 @@ static void update_node_stat(ir_node *node, void *env)
        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 */
 
 /**
@@ -1644,14 +1661,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 */
 
@@ -2230,6 +2248,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 +2258,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 +2267,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 */