replace is_no_Block() with !is_Block()
[libfirm] / ir / opt / combo.c
index 32e2c0f..8dfd40d 100644 (file)
@@ -1666,7 +1666,8 @@ static void cause_splits(environment_t *env)
  * @return *P
  */
 static partition_t *split_by_what(partition_t *X, what_func What,
-                                  partition_t **P, environment_t *env) {
+                                  partition_t **P, environment_t *env)
+{
        node_t          *x, *S;
        listmap_t       map;
        listmap_entry_t *iter;
@@ -2301,14 +2302,19 @@ static void compute_Cmp(node_t *node)
        node_t         *r    = get_irn_node(get_Cmp_right(cmp));
        lattice_elem_t a     = l->type;
        lattice_elem_t b     = r->type;
+       ir_mode        *mode = get_irn_mode(get_Cmp_left(cmp));
 
        if (a.tv == tarval_top || b.tv == tarval_top) {
                node->type.tv = tarval_top;
        } else if (r->part == l->part) {
                /* both nodes congruent, we can probably do something */
-               node->type.tv = tarval_b_true;
+               if (mode_is_float(mode)) {
+                       /* beware of NaN's */
+                       node->type.tv = tarval_bottom;
+               } else {
+                       node->type.tv = tarval_b_true;
+               }
        } else if (is_con(a) && is_con(b)) {
-               /* both nodes are constants, we can probably do something */
                node->type.tv = tarval_b_true;
        } else {
                node->type.tv = tarval_bottom;
@@ -2335,13 +2341,16 @@ static void compute_Proj_Cmp(node_t *node, ir_node *cmp)
                node->type.tv = tarval_undefined;
        } else if (is_con(a) && is_con(b)) {
                default_compute(node);
-       } else if (r->part == l->part &&
-                  (!mode_is_float(get_irn_mode(l->node)) || pnc == pn_Cmp_Lt || pnc == pn_Cmp_Gt)) {
-               /*
-                * BEWARE: a == a is NOT always True for floating Point values, as
-                * NaN != NaN is defined, so we must check this here.
-                */
-               tv = pnc & pn_Cmp_Eq ? tarval_b_true: tarval_b_false;
+
+       /*
+        * BEWARE: a == a is NOT always True for floating Point values, as
+        * NaN != NaN is defined, so we must check this here.
+        * (while for some pnc we could still optimize we have to stay
+        *  consistent with compute_Cmp, so don't do anything for floats)
+        */
+       } else if (r->part == l->part && !mode_is_float(get_irn_mode(l->node))) {
+
+               tv = pnc & pn_Cmp_Eq ? tarval_b_true : tarval_b_false;
 
                /* if the node was ONCE evaluated by all constants, but now
                   this breaks AND we get from the argument partitions a different
@@ -2591,7 +2600,7 @@ static void compute(node_t *node)
                return;
 #endif
 
-       if (is_no_Block(irn)) {
+       if (!is_Block(irn)) {
                /* for pinned nodes, check its control input */
                if (get_irn_pinned(skip_Proj(irn)) == op_pin_state_pinned) {
                        node_t *block = get_irn_node(get_nodes_block(irn));
@@ -3469,7 +3478,7 @@ static void apply_result(ir_node *irn, void *ctx)
 static void apply_end(ir_node *end, environment_t *env)
 {
        int i, j,  n = get_End_n_keepalives(end);
-       ir_node **in;
+       ir_node **in = NULL;
 
        if (n > 0)
                NEW_ARR_A(ir_node *, in, n);