From: Michael Beck Date: Mon, 8 Nov 2004 08:49:22 +0000 (+0000) Subject: Added x XOR x = 0 case X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=309108c29fb40f23adac4f7743d7aa37fd427ad3;p=libfirm Added x XOR x = 0 case reorder O function [r4296] --- diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 4c2bb350f..ea94b75eb 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -286,8 +286,13 @@ static tarval *computed_value_Eor(ir_node *n) ir_node *a = get_Eor_left(n); ir_node *b = get_Eor_right(n); - tarval *ta = value_of(a); - tarval *tb = value_of(b); + tarval *ta, *tb; + + if (a == b) + return get_tarval_null(get_irn_mode(n)); + + ta = value_of(a); + tb = value_of(b); if ((ta != tarval_bad) && (tb != tarval_bad)) { return tarval_eor (ta, tb); @@ -651,26 +656,6 @@ static ir_node *equivalent_node_Cond(ir_node *n) return n; } -/** - * Use algebraic simplification a v a = a. - */ -static ir_node *equivalent_node_Or(ir_node *n) -{ - ir_node *oldn = n; - - ir_node *a = get_Or_left(n); - ir_node *b = get_Or_right(n); - - /* remove a v a */ - if (a == b) { - n = a; - - DBG_OPT_ALGSIM1(oldn, a, b, n); - } - - return n; -} - /** * optimize operations that are commutative and have neutral 0, * so a op 0 = 0 op a = a. @@ -821,6 +806,29 @@ static ir_node *equivalent_node_DivMod(ir_node *n) return n; } +/** + * Use algebraic simplification a | a = a | 0 = 0 | a = a. + */ +static ir_node *equivalent_node_Or(ir_node *n) +{ + ir_node *oldn = n; + + ir_node *a = get_Or_left(n); + ir_node *b = get_Or_right(n); + + if (a == b) { + n = a; /* Or has it's own neutral element */ + } else if (classify_tarval(value_of(a)) == TV_CLASSIFY_NULL) { + n = b; + DBG_OPT_ALGSIM1(oldn, a, b, n); + } else if (classify_tarval(value_of(b)) == TV_CLASSIFY_NULL) { + n = a; + DBG_OPT_ALGSIM1(oldn, a, b, n); + } + + return n; +} + /** * Optimize a & 0b1...1 = 0b1...1 & a = a & a = a. */ @@ -1307,9 +1315,13 @@ static ir_node *transform_node_Not(ir_node *n) return n; } +/** + * Transform a Cast of a Const into a new Const + */ static ir_node *transform_node_Cast(ir_node *n) { ir_node *pred = get_Cast_op(n); type *tp = get_irn_type(pred); + if (get_irn_op(pred) == op_Const && get_Const_type(pred) != tp) { n = new_rd_Const_type(NULL, current_ir_graph, get_nodes_block(pred), get_irn_mode(pred), get_Const_tarval(pred), tp);