simplify-rtx.c (simplify_gen_relational): Simplify RTL of the form (ne (comp x y...
authorRoger Sayle <roger@eyesopen.com>
Fri, 7 Jun 2002 23:50:31 +0000 (23:50 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Fri, 7 Jun 2002 23:50:31 +0000 (23:50 +0000)
* 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
gcc/simplify-rtx.c

index afff77b7841dfce82dd6913222b3d21b5a3d4808..f07f710d1c496a5890f45ed69d8aaf8d6e850a1e 100644 (file)
@@ -1,3 +1,10 @@
+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
index 6ec33a3935be05754036ccf08c6beb6108b4ec3c..5db501eccfcad155f076e45bb7582fe5771448ac 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);