aboutsummaryrefslogtreecommitdiff
path: root/gcc/match.pd
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2016-06-13 13:21:45 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2016-06-13 11:21:45 +0000
commitb4817bd63533bc94d7605eefbdebc06dc271a63d (patch)
tree75eb715e32ceaf45a547f7361431eb2526795c04 /gcc/match.pd
parent915794eb26eaafe970c4c9f9d7774b55c4b772b5 (diff)
downloadgcc-b4817bd63533bc94d7605eefbdebc06dc271a63d.zip
gcc-b4817bd63533bc94d7605eefbdebc06dc271a63d.tar.gz
gcc-b4817bd63533bc94d7605eefbdebc06dc271a63d.tar.bz2
Move optimize_minmax_comparison to match.pd
2016-06-13 Marc Glisse <marc.glisse@inria.fr> * fold-const.c (optimize_minmax_comparison): Remove. (fold_comparison): Remove call to the above. * match.pd (MIN (X, Y) == X, MIN (X, 5) == 0, MIN (X, C1) < C2): New transformations. From-SVN: r237376
Diffstat (limited to 'gcc/match.pd')
-rw-r--r--gcc/match.pd32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 7d4beea..980b73b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1312,6 +1312,38 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(minmax (bit_not:s@2 @0) (bit_not:s@3 @1))
(bit_not (maxmin @0 @1))))
+/* MIN (X, Y) == X -> X <= Y */
+(for minmax (min min max max)
+ cmp (eq ne eq ne )
+ out (le gt ge lt )
+ (simplify
+ (cmp:c (minmax:c @0 @1) @0)
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0)))
+ (out @0 @1))))
+/* MIN (X, 5) == 0 -> X == 0
+ MIN (X, 5) == 7 -> false */
+(for cmp (eq ne)
+ (simplify
+ (cmp (min @0 INTEGER_CST@1) INTEGER_CST@2)
+ (if (wi::lt_p (@1, @2, TYPE_SIGN (TREE_TYPE (@0))))
+ { constant_boolean_node (cmp == NE_EXPR, type); }
+ (if (wi::gt_p (@1, @2, TYPE_SIGN (TREE_TYPE (@0))))
+ (cmp @0 @2)))))
+(for cmp (eq ne)
+ (simplify
+ (cmp (max @0 INTEGER_CST@1) INTEGER_CST@2)
+ (if (wi::gt_p (@1, @2, TYPE_SIGN (TREE_TYPE (@0))))
+ { constant_boolean_node (cmp == NE_EXPR, type); }
+ (if (wi::lt_p (@1, @2, TYPE_SIGN (TREE_TYPE (@0))))
+ (cmp @0 @2)))))
+/* MIN (X, C1) < C2 -> X < C2 || C1 < C2 */
+(for minmax (min min max max min min max max )
+ cmp (lt le gt ge gt ge lt le )
+ comb (bit_ior bit_ior bit_ior bit_ior bit_and bit_and bit_and bit_and)
+ (simplify
+ (cmp (minmax @0 INTEGER_CST@1) INTEGER_CST@2)
+ (comb (cmp @0 @2) (cmp @1 @2))))
+
/* Simplifications of shift and rotates. */
(for rotate (lrotate rrotate)