aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-07-28 08:55:17 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-07-28 08:55:17 +0000
commit32b436c0b9ba7050e26f4b9a858a4b186c6998ef (patch)
tree4cbd10b26a3a22de64e5caa3f5a3068b6b4a77ba /gcc
parent2637bd27e86c30bce73f6753e922b1b2f03ad47d (diff)
downloadgcc-32b436c0b9ba7050e26f4b9a858a4b186c6998ef.zip
gcc-32b436c0b9ba7050e26f4b9a858a4b186c6998ef.tar.gz
gcc-32b436c0b9ba7050e26f4b9a858a4b186c6998ef.tar.bz2
re PR middle-end/61734 (Regression in ABS_EXPR recognition)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/Wstrict-overflow-25.c2
-rw-r--r--gcc/testsuite/gcc.dg/fold-abs-5.c11
-rw-r--r--gcc/testsuite/gcc.dg/fold-compare-8.c2
6 files changed, 30 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fcb95b1..1db4587 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 0999625..7180662 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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",
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 014896c..ac3bd47 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/Wstrict-overflow-25.c b/gcc/testsuite/gcc.dg/Wstrict-overflow-25.c
index 0091644..774474d 100644
--- a/gcc/testsuite/gcc.dg/Wstrict-overflow-25.c
+++ b/gcc/testsuite/gcc.dg/Wstrict-overflow-25.c
@@ -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
index 0000000..dba4e4b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/fold-abs-5.c
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-compare-8.c b/gcc/testsuite/gcc.dg/fold-compare-8.c
index b6e42fd..2fb5fe9 100644
--- a/gcc/testsuite/gcc.dg/fold-compare-8.c
+++ b/gcc/testsuite/gcc.dg/fold-compare-8.c
@@ -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" } } */