diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-07-28 08:55:17 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-07-28 08:55:17 +0000 |
commit | 32b436c0b9ba7050e26f4b9a858a4b186c6998ef (patch) | |
tree | 4cbd10b26a3a22de64e5caa3f5a3068b6b4a77ba /gcc | |
parent | 2637bd27e86c30bce73f6753e922b1b2f03ad47d (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wstrict-overflow-25.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-abs-5.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-compare-8.c | 2 |
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" } } */ |