]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/61734 (Regression in ABS_EXPR recognition)
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 28 Jul 2014 08:55:17 +0000 (08:55 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 28 Jul 2014 08:55:17 +0000 (08:55 +0000)
PR middle-end/61734
* fold-const.c (fold_comparison): Disable X - Y CMP 0 to X CMP Y for
operators other than the equality operators.

From-SVN: r213118

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wstrict-overflow-25.c
gcc/testsuite/gcc.dg/fold-abs-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-compare-8.c

index fcb95b1a9cb756f46f7df145cd96449f62c5a7b0..1db458787999e16a5c8f270276b225b0ddad67b2 100644 (file)
@@ -1,3 +1,9 @@
+2014-07-28  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/61734
+       * fold-const.c (fold_comparison): Disable X - Y CMP 0 to X CMP Y for
+       operators other than the equality operators.
+
 2014-07-28  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/52478
index 0999625dc281dcd2386409abba58f5b6b127c277..718066238efb68e62fd93041ffc651da696672ef 100644 (file)
@@ -9026,9 +9026,13 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
 
   /* Transform comparisons of the form X - Y CMP 0 to X CMP Y.  */
   if (TREE_CODE (arg0) == MINUS_EXPR
-      && (equality_code || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)))
+      && equality_code
       && integer_zerop (arg1))
     {
+      /* ??? The transformation is valid for the other operators if overflow
+        is undefined for the type, but performing it here badly interacts
+        with the transformation in fold_cond_expr_with_comparison which
+        attempts to synthetize ABS_EXPR.  */
       if (!equality_code)
        fold_overflow_warning ("assuming signed overflow does not occur "
                               "when changing X - Y cmp 0 to X cmp Y",
index 014896c627c1579589c0602bc6562ef09ede3de2..ac3bd472a8f1fb924c7744918355919c3d651198 100644 (file)
@@ -1,3 +1,9 @@
+2014-07-28  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/fold-abs-5.c: New test.
+       * gcc.dg/Wstrict-overflow-25.c: XFAIL everywhere.
+       * gcc.dg/fold-compare-8.c: Likewise.
+
 2014-07-28  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/52478
index 00916446371a7399be5ae0807ad4b9113b017b62..774474d112352fe932d128f94a11a50b54d124aa 100644 (file)
@@ -7,5 +7,5 @@
 int
 foo (int x, int y)
 {
-  return x - y < 0; /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */
+  return x - y < 0; /* { dg-warning "assuming signed overflow does not occur" "correct warning" { xfail *-*-* } } */
 }
diff --git a/gcc/testsuite/gcc.dg/fold-abs-5.c b/gcc/testsuite/gcc.dg/fold-abs-5.c
new file mode 100644 (file)
index 0000000..dba4e4b
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+int test (int a, int b, int sum)
+{
+  sum += ((a - b) > 0 ? (a - b) : -(a - b));
+  return sum;
+}
+
+/* { dg-final { scan-tree-dump "ABS" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
index b6e42fdef108ad5e8d99d47d5d52a58f603144a5..2fb5fe9d1d4be9d0b5e662e26e1e03fd3690d4d0 100644 (file)
@@ -7,5 +7,5 @@ foo (int x, int y)
   return x - y < 0;
 }
 
-/* { dg-final { scan-tree-dump "x < y" "original" } } */
+/* { dg-final { scan-tree-dump "x < y" "original"  { xfail *-*-* } } } */
 /* { dg-final { cleanup-tree-dump "original" } } */