From 73be8b7f36eb4b2dfc47f23b3a685db25da34f09 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Thu, 13 Sep 2007 13:56:27 +0000 Subject: [PATCH 1/1] fixed two bugs, ~a == C case added [r15789] --- ir/ir/iropt.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 195b23596..5306e88ba 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -3261,7 +3261,7 @@ static ir_node *transform_node_Proj_Cmp(ir_node *proj) { left = lr; right = rl; changed |= 1; - } else if (lr = rl) { + } else if (lr == rl) { /* a + X CMP X + b ==> a CMP b */ left = ll; right = rr; @@ -3366,16 +3366,23 @@ static ir_node *transform_node_Proj_Cmp(ir_node *proj) { * be optimized, see this: * -MININT < 0 =/=> MININT > 0 !!! */ - if (get_opt_constant_folding() && get_irn_op(left) == op_Minus && + if (is_Minus(left) && (!mode_overflow_on_unary_Minus(mode) || (mode_is_int(mode) && (proj_nr == pn_Cmp_Eq || proj_nr == pn_Cmp_Lg)))) { - left = get_Minus_op(left); tv = tarval_neg(tv); if (tv != tarval_bad) { + left = get_Minus_op(left); proj_nr = get_inversed_pnc(proj_nr); changed |= 2; } + } else if (is_Not(left) && (proj_nr == pn_Cmp_Eq || proj_nr == pn_Cmp_Lg)) { + tv = tarval_not(tv); + + if (tv != tarval_bad) { + left = get_Not_op(left); + changed |= 2; + } } /* for integer modes, we have more */ @@ -3412,14 +3419,12 @@ static ir_node *transform_node_Proj_Cmp(ir_node *proj) { if (proj_nr == pn_Cmp_Eq || proj_nr == pn_Cmp_Lg) { /* a-b == 0 ==> a == b, a-b != 0 ==> a != b */ - if (classify_tarval(tv) == TV_CLASSIFY_NULL && get_irn_op(left) == op_Sub) { - right = get_Sub_right(left); + if (classify_tarval(tv) == TV_CLASSIFY_NULL && is_Sub(left)) { + right =get_Sub_right(left); left = get_Sub_left(left); tv = value_of(right); - if (tv != tarval_bad) { - changed = 1; - } + changed = 1; } if (tv != tarval_bad) { @@ -3522,8 +3527,7 @@ static ir_node *transform_node_Proj_Cmp(ir_node *proj) { right = new_Const(mode, tv); /* create a new compare */ - n = new_rd_Cmp(get_irn_dbg_info(n), current_ir_graph, block, - left, right); + n = new_rd_Cmp(get_irn_dbg_info(n), current_ir_graph, block, left, right); set_Proj_pred(proj, n); set_Proj_proj(proj, proj_nr); -- 2.20.1