From bc9c18c3193347c70989e21c036cc5c298021569 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Fri, 7 Jun 2002 23:50:31 +0000 Subject: [PATCH] simplify-rtx.c (simplify_gen_relational): Simplify RTL of the form (ne (comp x y) 0) into (comp x y) where comp is a... * simplify-rtx.c (simplify_gen_relational): Simplify RTL of the form (ne (comp x y) 0) into (comp x y) where comp is a comparison code. Simplify (eq (comp x y) 0) into (revcomp x y) if the sense of the comparison code comp can be reversed. From-SVN: r54357 --- gcc/ChangeLog | 7 +++++++ gcc/simplify-rtx.c | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index afff77b7841..f07f710d1c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-06-07 Roger Sayle + + * simplify-rtx.c (simplify_gen_relational): Simplify RTL of the form + (ne (comp x y) 0) into (comp x y) where comp is a comparison code. + Simplify (eq (comp x y) 0) into (revcomp x y) if the sense of the + comparison code comp can be reversed. + 2002-06-07 Roger Sayle * fold-const.c (fold) [EQ_EXPR]: Place both integer and real diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 6ec33a3935b..5db501eccfc 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -232,10 +232,31 @@ simplify_gen_relational (code, mode, cmp_mode, op0, op1) if ((tem = simplify_relational_operation (code, cmp_mode, op0, op1)) != 0) return tem; + /* For the following tests, ensure const0_rtx is op1. */ + if (op0 == const0_rtx && swap_commutative_operands_p (op0, op1)) + tem = op0, op0 = op1, op1 = tem, code = swap_condition (code); + /* If op0 is a compare, extract the comparison arguments from it. */ if (GET_CODE (op0) == COMPARE && op1 == const0_rtx) op1 = XEXP (op0, 1), op0 = XEXP (op0, 0); + /* If op0 is a comparison, extract the comparison arguments form it. */ + if (code == NE && op1 == const0_rtx + && GET_RTX_CLASS (GET_CODE (op0)) == '<') + return op0; + else if (code == EQ && op1 == const0_rtx) + { + /* The following tests GET_RTX_CLASS (GET_CODE (op0)) == '<'. */ + enum rtx_code new = reversed_comparison_code (op0, NULL_RTX); + if (new != UNKNOWN) + { + code = new; + mode = cmp_mode; + op1 = XEXP (op0, 1); + op0 = XEXP (op0, 0); + } + } + /* Put complex operands first and constants second. */ if (swap_commutative_operands_p (op0, op1)) tem = op0, op0 = op1, op1 = tem, code = swap_condition (code); -- 2.30.2