On Wed, 21 May 2025, Icen Zeyada wrote:
> Merge simple_comparison patterns under a single vec_cond_expr for bit_and,
> bit_ior, and bit_xor in the simplify pass.
>
> Ensure that when both operands of a bit_and, bit_or, or bit_xor 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, bit_ior and bit_xor.
>
> Signed-off-by: Icen Zeyada <[email protected]>
> ---
> gcc/match.pd | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 27f662f9714b..611f05ef9f9c 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -6524,6 +6524,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> { build_int_cst (integer_type_node, prec - 1);}))))))
> #endif
>
> +
> +(for lop (bit_and bit_ior bit_xor)
> + (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))))
> +
We do have some related patterns below
/* Sink binary operation to branches, but only if we can fold it. */
(for op (tcc_comparison plus minus mult bit_and bit_ior bit_xor
lshift rshift rdiv trunc_div ceil_div floor_div round_div
exact_div
trunc_mod ceil_mod floor_mod round_mod min max)
/* (c ? a : b) op (c ? d : e) --> c ? (a op d) : (b op e) */
...
so it probably makes sense to put this new pattern after the above
set? Can you please add a comment as well? I do wonder whether
there is enough canonicalization done to ensure integer_minus_onep
is always first and integer_zerop second? (I doubt), similar that
they line up with both vec_conds.
As written the expand_vec_cond_expr_p condition looks redundant -
neither the type of the result nor the type of the predicate
are changing. So you can drop this here I think.
Thanks,
Richard.
> (for cnd (cond vec_cond)
> /* (a != b) ? (a - b) : 0 -> (a - b) */
> (simplify
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)