On Thu, Feb 29, 2024 at 11:16:54AM +0100, Richard Biener wrote: > That said, the quick experiment shows this isn't anything for stage4.
The earlier the vector lowering is moved in the pass list, the higher are the possibilities that match.pd or some other optimization reintroduces unsupportable vector operations into the IL. Guess your patch looks reasonable. > > PR middle-end/114070 > > * match.pd ((c ? a : b) op d --> c ? (a op d) : (b op d)): > > Allow the folding if before lowering and the current IL > > isn't supported with vcond_mask. > > --- > > gcc/match.pd | 18 +++++++++++++++--- > > 1 file changed, 15 insertions(+), 3 deletions(-) > > > > diff --git a/gcc/match.pd b/gcc/match.pd > > index f3fffd8dec2..4edba7c84fb 100644 > > --- a/gcc/match.pd > > +++ b/gcc/match.pd > > @@ -5153,7 +5153,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > (op (vec_cond:s @0 @1 @2) (vec_cond:s @0 @3 @4)) > > (if (TREE_CODE_CLASS (op) != tcc_comparison > > || types_match (type, TREE_TYPE (@1)) > > - || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK)) > > + || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK) > > + || (optimize_vectors_before_lowering_p () > > + /* The following is optimistic on the side of non-support, we are > > + missing the legacy vcond{,u,eq} cases. Do this only when > > + lowering will be able to fixup.. */ > > + && !expand_vec_cond_expr_p (TREE_TYPE (@1), > > + TREE_TYPE (@0), ERROR_MARK))) > > (vec_cond @0 (op! @1 @3) (op! @2 @4)))) > > > > /* (c ? a : b) op d --> c ? (a op d) : (b op d) */ > > @@ -5161,13 +5167,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > (op (vec_cond:s @0 @1 @2) @3) > > (if (TREE_CODE_CLASS (op) != tcc_comparison > > || types_match (type, TREE_TYPE (@1)) > > - || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK)) > > + || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK) > > + || (optimize_vectors_before_lowering_p () > > + && !expand_vec_cond_expr_p (TREE_TYPE (@1), > > + TREE_TYPE (@0), ERROR_MARK))) > > (vec_cond @0 (op! @1 @3) (op! @2 @3)))) > > (simplify > > (op @3 (vec_cond:s @0 @1 @2)) > > (if (TREE_CODE_CLASS (op) != tcc_comparison > > || types_match (type, TREE_TYPE (@1)) > > - || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK)) > > + || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK) > > + || (optimize_vectors_before_lowering_p () > > + && !expand_vec_cond_expr_p (TREE_TYPE (@1), > > + TREE_TYPE (@0), ERROR_MARK))) > > (vec_cond @0 (op! @3 @1) (op! @3 @2))))) > > > > #if GIMPLE > > Jakub