]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR lto/85574 (LTO bootstapped binaries differ)
authorRichard Biener <rguenther@suse.de>
Fri, 4 May 2018 07:25:54 +0000 (07:25 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 4 May 2018 07:25:54 +0000 (07:25 +0000)
2018-05-04  Richard Biener  <rguenther@suse.de>

PR middle-end/85574
* fold-const.c (negate_expr_p): Restrict negation of operand
zero of a division to when we know that can happen without
overflow.
(fold_negate_expr_1): Likewise.

* gcc.dg/torture/pr85574.c: New testcase.
* gcc.dg/torture/pr57656.c: Use dg-additional-options.

From-SVN: r259922

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr57656.c
gcc/testsuite/gcc.dg/torture/pr85574.c [new file with mode: 0644]

index 229e095137118474603cfc7efe14a3b9e7442151..3e769f54e6b8caec9ed7d40452ed5085035276de 100644 (file)
@@ -1,3 +1,11 @@
+2018-05-04  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/85574
+       * fold-const.c (negate_expr_p): Restrict negation of operand
+       zero of a division to when we know that can happen without
+       overflow.
+       (fold_negate_expr_1): Likewise.
+
 2018-05-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR libstdc++/85466
index 6472f10309482c75bfef299268b746edd594916a..faa184a2bbdd3df8ff05b896e60eeadeb23db327 100644 (file)
@@ -474,12 +474,15 @@ negate_expr_p (tree t)
     case EXACT_DIV_EXPR:
       if (TYPE_UNSIGNED (type))
        break;
-      if (negate_expr_p (TREE_OPERAND (t, 0)))
+      /* In general we can't negate A in A / B, because if A is INT_MIN and
+         B is not 1 we change the sign of the result.  */
+      if (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
+         && negate_expr_p (TREE_OPERAND (t, 0)))
        return true;
       /* In general we can't negate B in A / B, because if A is INT_MIN and
         B is 1, we may turn this into INT_MIN / -1 which is undefined
         and actually traps on some architectures.  */
-      if (! INTEGRAL_TYPE_P (TREE_TYPE (t))
+      if (! ANY_INTEGRAL_TYPE_P (TREE_TYPE (t))
          || TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
          || (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
              && ! integer_onep (TREE_OPERAND (t, 1))))
@@ -652,14 +655,17 @@ fold_negate_expr_1 (location_t loc, tree t)
     case EXACT_DIV_EXPR:
       if (TYPE_UNSIGNED (type))
        break;
-      if (negate_expr_p (TREE_OPERAND (t, 0)))
+      /* In general we can't negate A in A / B, because if A is INT_MIN and
+        B is not 1 we change the sign of the result.  */
+      if (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
+         && negate_expr_p (TREE_OPERAND (t, 0)))
        return fold_build2_loc (loc, TREE_CODE (t), type,
                                negate_expr (TREE_OPERAND (t, 0)),
                                TREE_OPERAND (t, 1));
       /* In general we can't negate B in A / B, because if A is INT_MIN and
         B is 1, we may turn this into INT_MIN / -1 which is undefined
         and actually traps on some architectures.  */
-      if ((! INTEGRAL_TYPE_P (TREE_TYPE (t))
+      if ((! ANY_INTEGRAL_TYPE_P (TREE_TYPE (t))
           || TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
           || (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
               && ! integer_onep (TREE_OPERAND (t, 1))))
index 6b5077535db654b8cddee1b770f60f1ce7f0bc40..9e5784eb346f0905f2ba85f23cebe93572d2c715 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-04  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/85574
+       * gcc.dg/torture/pr85574.c: New testcase.
+       * gcc.dg/torture/pr57656.c: Use dg-additional-options.
+
 2018-05-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR libstdc++/85466
index 4f3645e4693ea2895bdb1e50eb42448f8d579cc4..02490140105984cc4cf424912fbebbd2e77ddcb5 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-fstrict-overflow" } */
+/* { dg-additional-options "-fstrict-overflow" } */
 
 int main (void)
 {
diff --git a/gcc/testsuite/gcc.dg/torture/pr85574.c b/gcc/testsuite/gcc.dg/torture/pr85574.c
new file mode 100644 (file)
index 0000000..5d95c96
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fwrapv" } */
+
+#include "pr57656.c"