This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
match.pd patch: max(int_min, x)->x
- From: Marc Glisse <marc dot glisse at inria dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 20 Apr 2016 20:44:15 +0200 (CEST)
- Subject: match.pd patch: max(int_min, x)->x
- Authentication-results: sourceware.org; auth=none
Hello,
this simple transformation is currently done in RTL, sometimes also
in VRP if we have any kind of range information (even on the wrong side,
but not with VR_VARYING). It seems more natural to complete the match.pd
pattern than make VRP understand this case.
Bootstrap+regtest on powerpc64le-unknown-linux-gnu (some noise in libgomp
testcases).
2016-04-21 Marc Glisse <marc.glisse@inria.fr>
gcc/
* match.pd (min(int_max, x), max(int_min, x)): New transformations.
gcc/testsuite/
* gcc.dg/tree-ssa/minmax-1.c: New testcase.
--
Marc Glisse
Index: gcc/match.pd
===================================================================
--- gcc/match.pd (revision 235292)
+++ gcc/match.pd (working copy)
@@ -1185,30 +1185,40 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* min(max(x,y),y) -> y. */
(simplify
(min:c (max:c @0 @1) @1)
@1)
/* max(min(x,y),y) -> y. */
(simplify
(max:c (min:c @0 @1) @1)
@1)
(simplify
(min @0 @1)
- (if (INTEGRAL_TYPE_P (type)
- && TYPE_MIN_VALUE (type)
- && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
- @1))
+ (switch
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MIN_VALUE (type)
+ && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
+ @1)
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MAX_VALUE (type)
+ && operand_equal_p (@1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
+ @0)))
(simplify
(max @0 @1)
- (if (INTEGRAL_TYPE_P (type)
- && TYPE_MAX_VALUE (type)
- && operand_equal_p (@1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
- @1))
+ (switch
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MAX_VALUE (type)
+ && operand_equal_p (@1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
+ @1)
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MIN_VALUE (type)
+ && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
+ @0)))
(for minmax (FMIN FMAX)
/* If either argument is NaN, return the other one. Avoid the
transformation if we get (and honor) a signalling NaN. */
(simplify
(minmax:c @0 REAL_CST@1)
(if (real_isnan (TREE_REAL_CST_PTR (@1))
&& (!HONOR_SNANS (@1) || !TREE_REAL_CST (@1).signalling))
@0)))
/* Convert fmin/fmax to MIN_EXPR/MAX_EXPR. C99 requires these
functions to return the numeric arg if the other one is NaN.
Index: gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c (revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c (working copy)
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+static int min(int a,int b){return (a<b)?a:b;}
+static int max(int a,int b){return (a<b)?b:a;}
+int f(int x){return max(x,-__INT_MAX__-1);}
+int g(int x){return min(x,__INT_MAX__);}
+
+/* { dg-final { scan-tree-dump-times "return x_\[0-9\]+.D.;" 2 "optimized" } } */