https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98211

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |duanbo3 at huawei dot com,
                   |                            |rsandifo at gcc dot gnu.org

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
OK, ICEs all over the place as expected.

Btw, on the GCC 10 branch we had

diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index 6a5f9505792..52725f826c7 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -4452,16 +4452,7 @@ vect_recog_mask_conversion_pattern (vec_info *vinfo,
       if (TREE_CODE (rhs1) != SSA_NAME)
        {
          tmp = vect_recog_temp_ssa_var (TREE_TYPE (rhs1), NULL);
-         if (rhs1_op0_type
-             && TYPE_PRECISION (rhs1_op0_type) != TYPE_PRECISION (rhs1_type))
-           rhs1_op0 = build_mask_conversion (vinfo, rhs1_op0,
-                                             vectype2, stmt_vinfo);
-         if (rhs1_op1_type
-             && TYPE_PRECISION (rhs1_op1_type) != TYPE_PRECISION (rhs1_type))
-           rhs1_op1 = build_mask_conversion (vinfo, rhs1_op1,
-                                     vectype2, stmt_vinfo);
-         pattern_stmt = gimple_build_assign (tmp, TREE_CODE (rhs1),
-                                             rhs1_op0, rhs1_op1);
+         pattern_stmt = gimple_build_assign (tmp, rhs1);
          rhs1 = tmp;
          append_pattern_def_seq (vinfo, stmt_vinfo, pattern_stmt, vectype2,
                                  rhs1_type);

and going back fixes the issue as well.  That was changed by g:91d80cf4bd28,
approved by Richard.

That said, using build_mask_conversion on sth not already a mask is definitely
wrong as can be seen here.  The above conversions should, according to the
revs comment, only happen when rhs1_op0_type != rhs1_op1_type (those are
scalar types here - but revs comment says vector types mismatch).

That said, if we throw bool patterns ontop of the mask conversion one we end
up not vectorizing the thing because

x3.c:23:9: note:   ==> examining statement: patt_22 = _28 ? 1 : 0;
x3.c:6:1: missed:   not vectorized: relevant stmt not supported: patt_22 = _28
? 1 : 0;

which is because vect_is_simple_cond runs into

  /* Mask case.  */        
  if (TREE_CODE (cond) == SSA_NAME
      && VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (cond)))
    {
      if (!vect_is_simple_use (vinfo, stmt_info, slp_node, 0, &cond,
                               &slp_op, &dts[0], comp_vectype)
          || !*comp_vectype
          || !VECTOR_BOOLEAN_TYPE_P (*comp_vectype))
        return false;

so I guess that should end up as mask conversion pattern as well, recursively.

Meh.

Reply via email to