summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-21 10:45:11 +0000
committerglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-21 10:45:11 +0000
commitf3ec09703c0dbe2c1ab5c1f9c460d8847d1d6c9e (patch)
tree9c71f5fe36a43f04e6a56e5d7fb4c36d8250ccb1
parent0b254a4dd1922150c0fc99e8824f27d642f5eadd (diff)
downloadgcc-f3ec09703c0dbe2c1ab5c1f9c460d8847d1d6c9e.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235332 138bc75d-0d04-0410-961f-82ee72b054a4
-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 26d1861456f..86bee074b69 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 38193216aee..08db842989d 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 98db7d0577c..08f70405c52 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 00000000000..98c38b1aa77
--- /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" } } */