On Wed, Apr 23, 2025 at 5:58 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> This moves the `(cmp (cond @0 @1 @2) @3)` simplifcation to be after the 
> boolean comparison
> simplifcations so that we don't end up simplifing into the same thing for a 
> GIMPLE_COND.

OK.

Richard.

> gcc/ChangeLog:
>
>         * match.pd: Move `(cmp (cond @0 @1 @2) @3)` simplifcation after
>         the bool comparison simplifications.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/match.pd | 31 +++++++++++++++++--------------
>  1 file changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index ba036e52837..0fe90a6edc4 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -7759,20 +7759,6 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>    (cmp (bit_and@2 @0 integer_pow2p@1) @1)
>    (icmp @2 { build_zero_cst (TREE_TYPE (@0)); })))
>
> -#if GIMPLE
> -/* From fold_binary_op_with_conditional_arg handle the case of
> -   rewriting (a ? b : c) > d to a ? (b > d) : (c > d) when the
> -   compares simplify.  */
> -(for cmp (simple_comparison)
> - (simplify
> -  (cmp:c (cond @0 @1 @2) @3)
> -  /* Do not move possibly trapping operations into the conditional as this
> -     pessimizes code and causes gimplification issues when applied late.  */
> -  (if (!FLOAT_TYPE_P (TREE_TYPE (@3))
> -       || !operation_could_trap_p (cmp, true, false, @3))
> -   (cond @0 (cmp! @1 @3) (cmp! @2 @3)))))
> -#endif
> -
>  (for cmp (ge lt)
>  /* x < 0 ? ~y : y into (x >> (prec-1)) ^ y. */
>  /* x >= 0 ? ~y : y into ~((x >> (prec-1)) ^ y). */
> @@ -8119,6 +8105,23 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>     replace if (x == 0) with tem = ~x; if (tem != 0) which is
>     clearly less optimal and which we'll transform again in forwprop.  */
>
> +#if GIMPLE
> +/* From fold_binary_op_with_conditional_arg handle the case of
> +   rewriting (a ? b : c) > d to a ? (b > d) : (c > d) when the
> +   compares simplify.
> +   This should be after the boolean comparison simplification so
> +   that it can remove the outer comparison before appling it to
> +   the inner condtional operands.  */
> +(for cmp (simple_comparison)
> + (simplify
> +  (cmp:c (cond @0 @1 @2) @3)
> +  /* Do not move possibly trapping operations into the conditional as this
> +     pessimizes code and causes gimplification issues when applied late.  */
> +  (if (!FLOAT_TYPE_P (TREE_TYPE (@3))
> +       || !operation_could_trap_p (cmp, true, false, @3))
> +   (cond @0 (cmp! @1 @3) (cmp! @2 @3)))))
> +#endif
> +
>  /* Transform comparisons of the form (X & Y) CMP 0 to X CMP2 Z
>     where ~Y + 1 == pow2 and Z = ~Y.  */
>  (for cst (VECTOR_CST INTEGER_CST)
> --
> 2.43.0
>

Reply via email to