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;

Reply via email to