Use consistent compatibility checks in vectorizable_shift
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 14 Nov 2019 14:58:21 +0000 (14:58 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 14 Nov 2019 14:58:21 +0000 (14:58 +0000)
The validation phase of vectorizable_shift used TYPE_MODE to check
whether the shift amount vector was compatible with the shifted vector:

      if ((op1_vectype == NULL_TREE
   || TYPE_MODE (op1_vectype) != TYPE_MODE (vectype))
    && (!slp_node
        || SLP_TREE_DEF_TYPE
     (SLP_TREE_CHILDREN (slp_node)[1]) != vect_constant_def))

But the generation phase was stricter and required the element types to
be equivalent:

   && !useless_type_conversion_p (TREE_TYPE (vectype),
  TREE_TYPE (op1)))

This difference led to an ICE with a later patch.

The first condition seems a bit too lax given that the function
supports vect_worthwhile_without_simd_p, where two different vector
types could have the same integer mode.  But it seems too strict
to reject signed shifts by unsigned amounts or unsigned shifts by
signed amounts; verify_gimple_assign_binary is happy with those.

This patch therefore goes for a middle ground of checking both TYPE_MODE
and TYPE_VECTOR_SUBPARTS, using the same condition in both places.

2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-vect-stmts.c (vectorizable_shift): Check the number
of vector elements as well as the type mode when deciding
whether an op1_vectype is compatible.  Reuse the result of
this check when generating vector statements.

From-SVN: r278235

gcc/ChangeLog
gcc/tree-vect-stmts.c

index 210a9c4f4ab2e8ae808866f1967a5b42d522af2b..70e50ae3fcfe174d6467519d9ac899aa25094422 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-stmts.c (vectorizable_shift): Check the number
+       of vector elements as well as the type mode when deciding
+       whether an op1_vectype is compatible.  Reuse the result of
+       this check when generating vector statements.
+
 2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-stmts.c (get_vectype_for_scalar_type_and_size): If
index 9361a23785e4337a6649b2464aac5500ed812942..15c798d1fa24e4dbbcdf061c7c92ce5a6d8d3501 100644 (file)
@@ -5544,6 +5544,7 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
   bool scalar_shift_arg = true;
   bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
   vec_info *vinfo = stmt_info->vinfo;
+  bool incompatible_op1_vectype_p = false;
 
   if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
     return false;
@@ -5688,8 +5689,12 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
 
       if (!op1_vectype)
        op1_vectype = get_same_sized_vectype (TREE_TYPE (op1), vectype_out);
-      if ((op1_vectype == NULL_TREE
-          || TYPE_MODE (op1_vectype) != TYPE_MODE (vectype))
+      incompatible_op1_vectype_p
+       = (op1_vectype == NULL_TREE
+          || maybe_ne (TYPE_VECTOR_SUBPARTS (op1_vectype),
+                       TYPE_VECTOR_SUBPARTS (vectype))
+          || TYPE_MODE (op1_vectype) != TYPE_MODE (vectype));
+      if (incompatible_op1_vectype_p
          && (!slp_node
              || SLP_TREE_DEF_TYPE
                   (SLP_TREE_CHILDREN (slp_node)[1]) != vect_constant_def))
@@ -5835,9 +5840,7 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
                     }
                 }
             }
-         else if (slp_node
-                  && !useless_type_conversion_p (TREE_TYPE (vectype),
-                                                 TREE_TYPE (op1)))
+         else if (slp_node && incompatible_op1_vectype_p)
            {
              if (was_scalar_shift_arg)
                {