OSDN Git Service

PR middle-end/53501
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jun 2012 17:03:19 +0000 (17:03 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jun 2012 17:03:19 +0000 (17:03 +0000)
* fold-const.c (fold_binary_loc): Refine previous change.
testsuite/
* c-c++-common/restrict-2.c: Revert previous change.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@188119 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/restrict-2.c

index 61b0392..8c5c036 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/53501
+       * fold-const.c (fold_binary_loc): Refine previous change.
+
 2012-06-01  Oleg Endo  <olegendo@gcc.gnu.org>
 
        Backport from mainline
index f3fdf49..26d43e4 100644 (file)
@@ -10022,15 +10022,18 @@ fold_binary_loc (location_t loc,
            }
        }
 
-      /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
-        same or one.  Make sure type is not saturating.
-        fold_plusminus_mult_expr will re-associate.  */
-      if ((TREE_CODE (op0) == MULT_EXPR
-          || TREE_CODE (op1) == MULT_EXPR)
+      /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or
+        one.  Make sure the type is not saturating and has the signedness of
+        the stripped operands, as fold_plusminus_mult_expr will re-associate.
+        ??? The latter condition should use TYPE_OVERFLOW_* flags instead.  */
+      if ((TREE_CODE (arg0) == MULT_EXPR
+          || TREE_CODE (arg1) == MULT_EXPR)
          && !TYPE_SATURATING (type)
+         && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
+         && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
          && (!FLOAT_TYPE_P (type) || flag_associative_math))
         {
-         tree tem = fold_plusminus_mult_expr (loc, code, type, op0, op1);
+         tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
          if (tem)
            return tem;
        }
@@ -10634,15 +10637,18 @@ fold_binary_loc (location_t loc,
          && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
        return tem;
 
-      /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
-        same or one.  Make sure type is not saturating.
-        fold_plusminus_mult_expr will re-associate.  */
-      if ((TREE_CODE (op0) == MULT_EXPR
-          || TREE_CODE (op1) == MULT_EXPR)
+      /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or
+        one.  Make sure the type is not saturating and has the signedness of
+        the stripped operands, as fold_plusminus_mult_expr will re-associate.
+        ??? The latter condition should use TYPE_OVERFLOW_* flags instead.  */
+      if ((TREE_CODE (arg0) == MULT_EXPR
+          || TREE_CODE (arg1) == MULT_EXPR)
          && !TYPE_SATURATING (type)
+         && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
+         && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
          && (!FLOAT_TYPE_P (type) || flag_associative_math))
         {
-         tree tem = fold_plusminus_mult_expr (loc, code, type, op0, op1);
+         tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
          if (tem)
            return tem;
        }
index c5dbcb2..9c7eabf 100644 (file)
@@ -1,5 +1,9 @@
 2012-06-01  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * c-c++-common/restrict-2.c: Revert previous change.
+
+2012-06-01  Eric Botcazou  <ebotcazou@adacore.com>
+
        PR ada/53517
        * gnat.dg/lto14.adb: Skip on Solaris.
 
index 42ed398..3f71b77 100644 (file)
@@ -10,5 +10,5 @@ void foo (float * __restrict__ a, float * __restrict__ b, int n, int j)
 
 /* We should move the RHS of the store out of the loop.  */
 
-/* { dg-final { scan-tree-dump-times "Moving statement" 10 "lim1" } } */
+/* { dg-final { scan-tree-dump-times "Moving statement" 11 "lim1" } } */
 /* { dg-final { cleanup-tree-dump "lim1" } } */