PR rtl-optimization/18942
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Dec 2004 20:48:53 +0000 (20:48 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Dec 2004 20:48:53 +0000 (20:48 +0000)
* simplify-rtx.c (simplify_relational_operation_1): Simplify
x + cst1 == cst2 to x == cst2 - cst1.  Made static.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92429 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/simplify-rtx.c

index db153d5..45c0a27 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-20  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR rtl-optimization/18942
+       * simplify-rtx.c (simplify_relational_operation_1): Simplify
+       x + cst1 == cst2 to x == cst2 - cst1.  Made static.
+
 2004-12-20  Matt Austern  <austern@apple.com>
 
        PR c++/19044
index 5feeb65..8d7cb3f 100644 (file)
@@ -2773,10 +2773,13 @@ simplify_relational_operation (enum rtx_code code, enum machine_mode mode,
 
    MODE is the mode of the result, while CMP_MODE specifies in which
    mode the comparison is done in, so it is the mode of the operands.  */
-rtx
+
+static rtx
 simplify_relational_operation_1 (enum rtx_code code, enum machine_mode mode,
                                 enum machine_mode cmp_mode, rtx op0, rtx op1)
 {
+  enum rtx_code op0code = GET_CODE (op0);
+
   if (GET_CODE (op1) == CONST_INT)
     {
       if (INTVAL (op1) == 0 && COMPARISON_P (op0))
@@ -2800,6 +2803,20 @@ simplify_relational_operation_1 (enum rtx_code code, enum machine_mode mode,
        }
     }
 
+  /* (eq/ne (plus x cst1) cst2) simplifies to (eq/ne x (cst2 - cst1))  */
+  if ((code == EQ || code == NE)
+      && (op0code == PLUS || op0code == MINUS)
+      && CONSTANT_P (op1)
+      && CONSTANT_P (XEXP (op0, 1)))
+    {
+      rtx x = XEXP (op0, 0);
+      rtx c = XEXP (op0, 1);
+
+      c = simplify_gen_binary (op0code == PLUS ? MINUS : PLUS,
+                              cmp_mode, op1, c);
+      return simplify_gen_relational (code, mode, cmp_mode, x, c);
+    }
+
   return NULL_RTX;
 }