https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103771
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Forcing the pattern to not trigger produces the expected t.c:8:6: missed: not vectorized: relevant stmt not supported: iftmp.0_21 = x.1_14 > 255 ? iftmp.0_19 : iftmp.0_20; since condition vectorization itself doesn't know how to handle this, we end up at if (vectype1 && !useless_type_conversion_p (vectype, vectype1)) return false; with vectype V32QI and vectype1 V8SI. Splitting out the compare from the COND_EXPR in the pattern but leaving out the attempt to "widen" it reveals the same fact that vectorizable_condition doesn't support packing of multiple vector defs for the mask operand. I think that is what we need to add. We also don't have a good representation for "packing" of masks. diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 3ea905538e1..729a1d32612 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -4679,8 +4679,10 @@ vect_recog_mask_conversion_pattern (vec_info *vinfo, rhs1_type); } - if (maybe_ne (TYPE_VECTOR_SUBPARTS (vectype1), - TYPE_VECTOR_SUBPARTS (vectype2))) + /* AVX512 style masks cannot be packed/unpacked. */ + if (TYPE_PRECISION (TREE_TYPE (vectype2)) != 1 + && maybe_ne (TYPE_VECTOR_SUBPARTS (vectype1), + TYPE_VECTOR_SUBPARTS (vectype2))) tmp = build_mask_conversion (vinfo, rhs1, vectype1, stmt_vinfo); else tmp = rhs1;