beware of NaN's
[libfirm] / ir / stat / firmstat.c
index 44defc0..f665ee9 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;
 
 /**
@@ -260,7 +263,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;
 
-       /* clear accumulated / non-acumulated counter */
+       /* clear accumulated / non-accumulated counter */
        for (i = all ? 0 : _gcnt_non_acc; i < _gcnt_last; ++i) {
                cnt_clr(&elem->cnt[i]);
        }  /* for */
@@ -564,29 +567,35 @@ 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) {
                        /* special case, a Sel of a Sel, count on extra counter */
@@ -816,7 +825,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
-       * 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);
@@ -1641,11 +1650,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 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);
 
+       /* 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 */
@@ -1692,7 +1706,7 @@ static void stat_merge_nodes(
                                                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 */
        }
@@ -1732,7 +1746,7 @@ static void stat_lower(void *ctx, ir_node *node) {
        {
                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 */
@@ -1797,7 +1811,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]);
 
-               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 */
@@ -1870,7 +1884,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);
-               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 */
@@ -1889,7 +1903,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);
-               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 */
@@ -2225,6 +2239,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;
@@ -2232,6 +2249,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;
@@ -2240,6 +2258,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 */