diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2016-04-21 12:45:11 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2016-04-21 10:45:11 +0000 |
commit | ce0e66ffb22832d1668dd9d92ad0ca128fbd07c3 (patch) | |
tree | 9c71f5fe36a43f04e6a56e5d7fb4c36d8250ccb1 /gcc | |
parent | 6c7f7b8c698b13ddd97d047c738da48a518e9f0f (diff) | |
download | gcc-ce0e66ffb22832d1668dd9d92ad0ca128fbd07c3.zip gcc-ce0e66ffb22832d1668dd9d92ad0ca128fbd07c3.tar.gz gcc-ce0e66ffb22832d1668dd9d92ad0ca128fbd07c3.tar.bz2 |
min(-x, -y), min(~x, ~y)
2016-04-21 Marc Glisse <marc.glisse@inria.fr>
gcc/
* match.pd (min(-x, -y), max(-x, -y), min(~x, ~y), max(~x, ~y)):
New transformations.
gcc/testsuite/
* gcc.dg/tree-ssa/minmax-2.c: New testcase.
From-SVN: r235332
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/match.pd | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/minmax-2.c | 10 |
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 26d1861..86bee07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-04-21 Marc Glisse <marc.glisse@inria.fr> + * match.pd (min(-x, -y), max(-x, -y), min(~x, ~y), max(~x, ~y)): + New transformations. + +2016-04-21 Marc Glisse <marc.glisse@inria.fr> + * match.pd (min(int_max, x), max(int_min, x)): New transformations. 2016-04-20 Jan Hubicka <jh@suse.cz> diff --git a/gcc/match.pd b/gcc/match.pd index 3819321..08db842 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1232,6 +1232,22 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (FMAX @0 @1) (max @0 @1))) +/* min (-A, -B) -> -max (A, B) */ +(for minmax (min max FMIN FMAX) + maxmin (max min FMAX FMIN) + (simplify + (minmax (negate:s@2 @0) (negate:s@3 @1)) + (if (FLOAT_TYPE_P (TREE_TYPE (@0)) + || (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))) + (negate (maxmin @0 @1))))) +/* MIN (~X, ~Y) -> ~MAX (X, Y) + MAX (~X, ~Y) -> ~MIN (X, Y) */ +(for minmax (min max) + maxmin (max min) + (simplify + (minmax (bit_not:s@2 @0) (bit_not:s@3 @1)) + (bit_not (maxmin @0 @1)))) /* Simplifications of shift and rotates. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 98db7d0..08f7040 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2016-04-21 Marc Glisse <marc.glisse@inria.fr> + * gcc.dg/tree-ssa/minmax-2.c: New testcase. + +2016-04-21 Marc Glisse <marc.glisse@inria.fr> + * gcc.dg/tree-ssa/minmax-1.c: New testcase. 2016-04-20 Jan Hubicka <jh@suse.cz> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-2.c b/gcc/testsuite/gcc.dg/tree-ssa/minmax-2.c new file mode 100644 index 0000000..98c38b1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-overflow -fdump-tree-optimized" } */ + +static int max(int a,int b){return (a<b)?b:a;} +int f(int x,int y){return max(-x,-y);} +int g(int x,int y){return max(~x,~y);} +double h(double x,double y){return __builtin_fmax(-x,-y);} + +/* { dg-final { scan-tree-dump-times "MIN_EXPR" 2 "optimized" } } */ +/* { dg-final { scan-tree-dump "__builtin_fmin" "optimized" } } */ |