aboutsummaryrefslogtreecommitdiff
path: root/gcc/match.pd
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/match.pd
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/match.pd')
-rw-r--r--gcc/match.pd16
1 files changed, 16 insertions, 0 deletions
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. */