]> gcc.gnu.org Git - gcc.git/commitdiff
(simplify_comparison, case PLUS): Generalize simplification of (eq (plus A B) C).
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 3 Apr 1993 22:34:45 +0000 (17:34 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 3 Apr 1993 22:34:45 +0000 (17:34 -0500)
(simplify_comparison, case PLUS): Generalize simplification
of (eq (plus A B) C).
(simplify_comparison, case MINUS): Add corresponding cases.

From-SVN: r3992

gcc/combine.c

index 92fa365f524f380c4ef1fa7b86ddc734479d87fe..6993356eb07472d017d743e2e767ad284d5e1139 100644 (file)
@@ -8315,12 +8315,12 @@ simplify_comparison (code, pop0, pop1)
          break;
 
        case PLUS:
-         /* (eq (plus X C1) C2) -> (eq X (minus C2 C1)).  We can only do
+         /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
             this for equality comparisons due to pathological cases involving
             overflows.  */
-         if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
-             && (tem = simplify_binary_operation (MINUS, mode, op1,
-                                                  XEXP (op0, 1))) != 0)
+         if (equality_comparison_p
+             && 0 != (tem = simplify_binary_operation (MINUS, mode,
+                                                       op1, XEXP (op0, 1))))
            {
              op0 = XEXP (op0, 0);
              op1 = tem;
@@ -8338,6 +8338,28 @@ simplify_comparison (code, pop0, pop1)
          break;
 
        case MINUS:
+         /* (eq (minus A B) C) -> (eq A (plus B C)) or
+            (eq B (minus A C)), whichever simplifies.  We can only do
+            this for equality comparisons due to pathological cases involving
+            overflows.  */
+         if (equality_comparison_p
+             && 0 != (tem = simplify_binary_operation (PLUS, mode,
+                                                       XEXP (op0, 1), op1)))
+           {
+             op0 = XEXP (op0, 0);
+             op1 = tem;
+             continue;
+           }
+
+         if (equality_comparison_p
+             && 0 != (tem = simplify_binary_operation (MINUS, mode,
+                                                       XEXP (op0, 0), op1)))
+           {
+             op0 = XEXP (op0, 1);
+             op1 = tem;
+             continue;
+           }
+
          /* The sign bit of (minus (ashiftrt X C) X), where C is the number
             of bits in X minus 1, is one iff X > 0.  */
          if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
This page took 0.078536 seconds and 5 git commands to generate.