https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103771
--- Comment #9 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- (In reply to Richard Biener from comment #7) > 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; Haven't had time to look at it properly yet, but my first impression is that that's likely to regress SVE. Packing and unpacking are natural operations on boolean vector modes.