OSDN Git Service

* simplify-rtx.c (simplify_gen_relational): Simplify RTL of the form
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Jun 2002 23:50:31 +0000 (23:50 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Jun 2002 23:50:31 +0000 (23:50 +0000)
(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

gcc/ChangeLog
gcc/simplify-rtx.c

index afff77b..f07f710 100644 (file)
@@ -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.
index 6ec33a3..5db501e 100644 (file)
@@ -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);