On Fri, May 16, 2025 at 9:32 AM Icen Zeyada <icen.zeya...@arm.com> wrote:
>
> Merge simple_comparison patterns under a single vec_cond_expr for bit_and
> and bit_ior in the simplify pass.
>
> Ensure that when both operands of a bit-and or bit-or are simple_comparison
> results, they reside within the same vec_cond_expr rather than separate ones.
> This prepares the AST so that subsequent transformations (e.g., folding the
> comparisons if possible) can take effect.
>
> PR tree-optimization/119196
>
> gcc/ChangeLog:
>
>         * match.pd: Merge multiple vec_cond_expr in a single one for bit_and
> and bit_ior.
>
> Signed-off-by: Icen Zeyada <icen.zeya...@arm.com>
> ---
>  gcc/match.pd | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 79485f9678a0..da60d6a22290 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -6524,6 +6524,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>                 { build_int_cst (integer_type_node, prec - 1);}))))))
>  #endif
>
> +(for op1 (simple_comparison)
> + (for op2 (simple_comparison)
> +  (for lop (bit_and bit_ior)
> +    (simplify
> +      (lop
> +       (vec_cond @0 integer_minus_onep@2 integer_zerop@3)
> +       (vec_cond @1 @2 @3))
> +       (if (expand_vec_cond_expr_p (type, TREE_TYPE (@0)))
> +               (vec_cond (lop @0 @1) @2 @3))))))

I am trying to understand why you need op1/op2 here since they seem to
be unused?
Other than that it might make sense to extend `(a?0:-1) lop (b?0:-1)` too.
I am not sure but xor might show up; though I don't think it is as
important as &/| as you handle today.

Thanks,
Andrew

> +
>  (for cnd (cond vec_cond)
>   /* (a != b) ? (a - b) : 0 -> (a - b) */
>   (simplify
> --
> 2.43.0
>

Reply via email to