diff options
author | Bin Cheng <bin.cheng@arm.com> | 2016-10-27 08:31:01 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2016-10-27 08:31:01 +0000 |
commit | ad6e4ba8de6dc0efd62754164d432f9349beb25b (patch) | |
tree | 410ba71c2e4974725417983c0c6b57a9f4cdf81c /gcc | |
parent | fe14572b1ae8dc408645a0c4ce1d043d44acece6 (diff) | |
download | gcc-ad6e4ba8de6dc0efd62754164d432f9349beb25b.zip gcc-ad6e4ba8de6dc0efd62754164d432f9349beb25b.tar.gz gcc-ad6e4ba8de6dc0efd62754164d432f9349beb25b.tar.bz2 |
match.pd ((convert1 (minmax ((convert2 (x) c)))) -> minmax (x c)): New pattern.
* match.pd ((convert1 (minmax ((convert2 (x) c)))) -> minmax (x c)):
New pattern.
gcc/testsuite
* gcc.dg/fold-convmaxconv-1.c: New test.
* gcc.dg/fold-convminconv-1.c: New test.
From-SVN: r241612
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/match.pd | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-convmaxconv-1.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-convminconv-1.c | 15 |
5 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d8bdeee..ee733cf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-10-27 Bin Cheng <bin.cheng@arm.com> + + * match.pd ((convert1 (minmax ((convert2 (x) c)))) -> minmax (x c)): + New pattern. + 2016-10-26 Kelvin Nilsen <kelvin@gcc.gnu.org> PR target/78056 diff --git a/gcc/match.pd b/gcc/match.pd index 767d23a..73bee34 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1337,6 +1337,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && TYPE_MIN_VALUE (type) && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST)) @0))) + +/* (convert (minmax ((convert (x) c)))) -> minmax (x c) if x is promoted + and the outer convert demotes the expression back to x's type. */ +(for minmax (min max) + (simplify + (convert (minmax@0 (convert @1) INTEGER_CST@2)) + (if (types_match (@1, type) && int_fits_type_p (@2, type) + && TYPE_SIGN (TREE_TYPE (@0)) == TYPE_SIGN (type) + && TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (type)) + (minmax @1 (convert @2))))) + (for minmax (FMIN FMAX) /* If either argument is NaN, return the other one. Avoid the transformation if we get (and honor) a signalling NaN. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ac9901b..512e9a6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-10-27 Bin Cheng <bin.cheng@arm.com> + + * gcc.dg/fold-convmaxconv-1.c: New test. + * gcc.dg/fold-convminconv-1.c: New test. + 2016-10-26 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/78092 diff --git a/gcc/testsuite/gcc.dg/fold-convmaxconv-1.c b/gcc/testsuite/gcc.dg/fold-convmaxconv-1.c new file mode 100644 index 0000000..3ffff8b --- /dev/null +++ b/gcc/testsuite/gcc.dg/fold-convmaxconv-1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int foo (short a[], int x) +{ + unsigned int i; + for (i = 0; i < 1000; i++) + { + x = a[i]; + a[i] = (x <= 0 ? 0 : x); + } + return x; +} + +/* { dg-final { scan-tree-dump-not " = MAX_EXPR <x_\[0-9\]*" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/fold-convminconv-1.c b/gcc/testsuite/gcc.dg/fold-convminconv-1.c new file mode 100644 index 0000000..f4a048e --- /dev/null +++ b/gcc/testsuite/gcc.dg/fold-convminconv-1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int foo (unsigned short a[], unsigned int x) +{ + unsigned int i; + for (i = 0; i < 1000; i++) + { + x = a[i]; + a[i] = (x >= 255 ? 255 : x); + } + return x; +} + +/* { dg-final { scan-tree-dump-not " = MIN_EXPR <x_\[0-9\]*" "optimized" } } */ |