]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR middle-end/PR28690
authorPeter Bergner <bergner@vnet.ibm.com>
Mon, 23 Jul 2007 16:43:24 +0000 (11:43 -0500)
committerPeter Bergner <bergner@gcc.gnu.org>
Mon, 23 Jul 2007 16:43:24 +0000 (11:43 -0500)
PR middle-end/PR28690
* optabs.c (expand_binop): (emit_cmp_and_jump_insns): Allow EQ compares.
* rtlanal.c (commutative_operand_precedence): Prefer both REG_POINTER
and MEM_POINTER operands over REG and MEM operands.
(swap_commutative_operands_p): Change return value to bool.
* rtl.h: Update the corresponding prototype.
* tree-ssa-address.c (gen_addr_rtx): Use simplify_gen_binary
instead of gen_rtx_PLUS.
* simplify-rtx.c (simplify_plus_minus_op_data_cmp): Change return
value to bool.  Change function arguments to rtx's and update code
to match.
(simplify_plus_minus): Update the simplify_plus_minus_op_data_cmp
calls to match the new declaration.
* simplify-rtx.c (simplify_associative_operation): Don't
reorder simplify_binary_operation arguments.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r126852

gcc/ChangeLog
gcc/optabs.c
gcc/rtl.h
gcc/rtlanal.c
gcc/simplify-rtx.c
gcc/tree-ssa-address.c

index ad37fca1c92530c530246fd474eada9c4b6b7075..a40140f7a2e9258c5c5e89dc7b03d6d3b9e44c34 100644 (file)
@@ -1,3 +1,22 @@
+2007-07-23  Peter Bergner  <bergner@vnet.ibm.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/PR28690
+       * optabs.c (expand_binop): (emit_cmp_and_jump_insns): Allow EQ compares.
+       * rtlanal.c (commutative_operand_precedence): Prefer both REG_POINTER
+       and MEM_POINTER operands over REG and MEM operands.
+       (swap_commutative_operands_p): Change return value to bool.
+       * rtl.h: Update the corresponding prototype.
+       * tree-ssa-address.c (gen_addr_rtx): Use simplify_gen_binary
+       instead of gen_rtx_PLUS.
+       * simplify-rtx.c (simplify_plus_minus_op_data_cmp): Change return
+       value to bool.  Change function arguments to rtx's and update code
+       to match.
+       (simplify_plus_minus): Update the simplify_plus_minus_op_data_cmp
+       calls to match the new declaration.
+       * simplify-rtx.c (simplify_associative_operation): Don't
+       reorder simplify_binary_operation arguments.
+
 2007-07-23  Richard Sandiford  <richard@codesourcery.com>
 
        * config/mips/mips.c (override_options): Use mips_costs to derive
index c754544f10ffb6d5f0dcff84d94e8cf409d531ca..b65d6002f2b75d4ce8db7b05506e1760055c0306 100644 (file)
@@ -4070,9 +4070,11 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size,
   /* Swap operands and condition to ensure canonical RTL.  */
   if (swap_commutative_operands_p (x, y))
     {
-      /* If we're not emitting a branch, this means some caller
-         is out of sync.  */
-      gcc_assert (label);
+      /* If we're not emitting a branch, callers are required to pass
+        operands in an order conforming to canonical RTL.  We relax this
+        for commutative comparsions so callers using EQ don't need to do
+        swapping by hand.  */
+      gcc_assert (label || (comparison == swap_condition (comparison)));
 
       op0 = y, op1 = x;
       comparison = swap_condition (comparison);
index 63f65730d1092d4abf122c26a463c3949fab91ee..b658ff0d6aeea22b87558913e4c9648b242db240 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1690,7 +1690,7 @@ extern int reg_referenced_p (rtx, rtx);
 extern int reg_used_between_p (rtx, rtx, rtx);
 extern int reg_set_between_p (rtx, rtx, rtx);
 extern int commutative_operand_precedence (rtx);
-extern int swap_commutative_operands_p (rtx, rtx);
+extern bool swap_commutative_operands_p (rtx, rtx);
 extern int modified_between_p (rtx, rtx, rtx);
 extern int no_labels_between_p (rtx, rtx);
 extern int modified_in_p (rtx, rtx);
index 9535104e7079142c7c3a645c8ba73bd09c96ec2d..d948a08d421aabc94d9f94e4f7a82effa91fe050 100644 (file)
@@ -2877,9 +2877,9 @@ commutative_operand_precedence (rtx op)
   
   /* Constants always come the second operand.  Prefer "nice" constants.  */
   if (code == CONST_INT)
-    return -7;
+    return -8;
   if (code == CONST_DOUBLE)
-    return -6;
+    return -7;
   op = avoid_constant_pool_reference (op);
   code = GET_CODE (op);
 
@@ -2887,22 +2887,24 @@ commutative_operand_precedence (rtx op)
     {
     case RTX_CONST_OBJ:
       if (code == CONST_INT)
-        return -5;
+        return -6;
       if (code == CONST_DOUBLE)
-        return -4;
-      return -3;
+        return -5;
+      return -4;
 
     case RTX_EXTRA:
       /* SUBREGs of objects should come second.  */
       if (code == SUBREG && OBJECT_P (SUBREG_REG (op)))
-        return -2;
-
+        return -3;
       return 0;
 
     case RTX_OBJ:
       /* Complex expressions should be the first, so decrease priority
-         of objects.  */
-      return -1;
+         of objects.  Prefer pointer objects over non pointer objects.  */
+      if ((REG_P (op) && REG_POINTER (op))
+         || (MEM_P (op) && MEM_POINTER (op)))
+       return -1;
+      return -2;
 
     case RTX_COMM_ARITH:
       /* Prefer operands that are themselves commutative to be first.
@@ -2929,7 +2931,7 @@ commutative_operand_precedence (rtx op)
 /* Return 1 iff it is necessary to swap operands of commutative operation
    in order to canonicalize expression.  */
 
-int
+bool
 swap_commutative_operands_p (rtx x, rtx y)
 {
   return (commutative_operand_precedence (x)
index 9b27bbdbd70be96716c36766da0a4a95e9c03a34..40fedde9a0ba2a799f89eabbada09d5522a46c17 100644 (file)
@@ -52,7 +52,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 
 static rtx neg_const_int (enum machine_mode, rtx);
 static bool plus_minus_operand_p (rtx);
-static int simplify_plus_minus_op_data_cmp (const void *, const void *);
+static bool simplify_plus_minus_op_data_cmp (rtx, rtx);
 static rtx simplify_plus_minus (enum rtx_code, enum machine_mode, rtx, rtx);
 static rtx simplify_immed_subreg (enum machine_mode, rtx, enum machine_mode,
                                  unsigned int);
@@ -1499,16 +1499,12 @@ simplify_associative_operation (enum rtx_code code, enum machine_mode mode,
        }
 
       /* Attempt to simplify "(a op b) op c" as "a op (b op c)".  */
-      tem = swap_commutative_operands_p (XEXP (op0, 1), op1)
-           ? simplify_binary_operation (code, mode, op1, XEXP (op0, 1))
-           : simplify_binary_operation (code, mode, XEXP (op0, 1), op1);
+      tem = simplify_binary_operation (code, mode, XEXP (op0, 1), op1);
       if (tem != 0)
         return simplify_gen_binary (code, mode, XEXP (op0, 0), tem);
 
       /* Attempt to simplify "(a op b) op c" as "(a op c) op b".  */
-      tem = swap_commutative_operands_p (XEXP (op0, 0), op1)
-           ? simplify_binary_operation (code, mode, op1, XEXP (op0, 0))
-           : simplify_binary_operation (code, mode, XEXP (op0, 0), op1);
+      tem = simplify_binary_operation (code, mode, XEXP (op0, 0), op1);
       if (tem != 0)
         return simplify_gen_binary (code, mode, tem, XEXP (op0, 1));
     }
@@ -3313,23 +3309,21 @@ struct simplify_plus_minus_op_data
   short neg;
 };
 
-static int
-simplify_plus_minus_op_data_cmp (const void *p1, const void *p2)
+static bool
+simplify_plus_minus_op_data_cmp (rtx x, rtx y)
 {
-  const struct simplify_plus_minus_op_data *d1 = p1;
-  const struct simplify_plus_minus_op_data *d2 = p2;
   int result;
 
-  result = (commutative_operand_precedence (d2->op)
-           - commutative_operand_precedence (d1->op));
+  result = (commutative_operand_precedence (y)
+           - commutative_operand_precedence (x));
   if (result)
-    return result;
+    return result > 0;
 
   /* Group together equal REGs to do more simplification.  */
-  if (REG_P (d1->op) && REG_P (d2->op))
-    return REGNO (d1->op) - REGNO (d2->op);
+  if (REG_P (x) && REG_P (y))
+    return REGNO (x) > REGNO (y);
   else
-    return 0;
+    return false;
 }
 
 static rtx
@@ -3473,14 +3467,14 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0,
         {
           struct simplify_plus_minus_op_data save;
           j = i - 1;
-          if (simplify_plus_minus_op_data_cmp (&ops[j], &ops[i]) < 0)
+          if (!simplify_plus_minus_op_data_cmp (ops[j].op, ops[i].op))
            continue;
 
           canonicalized = 1;
           save = ops[i];
           do
            ops[j + 1] = ops[j];
-          while (j-- && simplify_plus_minus_op_data_cmp (&ops[j], &save) > 0);
+          while (j-- && simplify_plus_minus_op_data_cmp (ops[j].op, save.op));
           ops[j + 1] = save;
         }
 
index 7904b1af333f8e5247815610c1394f2c053036b8..b81135b636a0c92c2152513a7e307d8462279445 100644 (file)
@@ -125,7 +125,7 @@ gen_addr_rtx (rtx symbol, rtx base, rtx index, rtx step, rtx offset,
   if (base)
     {
       if (*addr)
-       *addr = gen_rtx_PLUS (Pmode, *addr, base);
+       *addr = simplify_gen_binary (PLUS, Pmode, base, *addr);
       else
        *addr = base;
     }