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;
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
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);