aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2016-04-21 12:45:11 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2016-04-21 10:45:11 +0000
commitce0e66ffb22832d1668dd9d92ad0ca128fbd07c3 (patch)
tree9c71f5fe36a43f04e6a56e5d7fb4c36d8250ccb1 /gcc
parent6c7f7b8c698b13ddd97d047c738da48a518e9f0f (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/match.pd16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/minmax-2.c10
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" } } */