match.pd patch: max(int_min, x)->x
Richard Biener
richard.guenther@gmail.com
Thu Apr 21 09:08:00 GMT 2016
On Wed, Apr 20, 2016 at 8:44 PM, Marc Glisse <marc.glisse@inria.fr> wrote:
> 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).
Ok.
Thanks,
Richard.
> 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"
> } } */
>
More information about the Gcc-patches
mailing list