PR middle-end/61734
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 28 Jul 2014 08:55:17 +0000 (08:55 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 28 Jul 2014 08:55:17 +0000 (08:55 +0000)
* fold-const.c (fold_comparison): Disable X - Y CMP 0 to X CMP Y for
operators other than the equality operators.

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

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 fcb95b1..1db4587 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 0999625..7180662 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 014896c..ac3bd47 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 0091644..774474d 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 b6e42fd..2fb5fe9 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" } } */