summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-07 23:50:31 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-07 23:50:31 +0000
commit6a64811f8ce2f1b700beeeb173419f82a9d8f2d3 (patch)
tree5f3c718932f00c23a8fca6901ef2f8a9bc17139e
parentf4185d2ba140576f0b8caa16dc495d8c4e122fc7 (diff)
downloadppe42-gcc-6a64811f8ce2f1b700beeeb173419f82a9d8f2d3.tar.gz
ppe42-gcc-6a64811f8ce2f1b700beeeb173419f82a9d8f2d3.zip
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54357 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/simplify-rtx.c21
2 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index afff77b7841..f07f710d1c4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2002-06-07 Roger Sayle <roger@eyesopen.com>
+ * 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 <roger@eyesopen.com>
+
* fold-const.c (fold) [EQ_EXPR]: Place both integer and real
constants last in comparisons. Optimize (x+1.0)>0.0 into the
equivalent x > -1.0 when -ffast-math.
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);
OpenPOWER on IntegriCloud