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)
commit0203c4f3bfb3e3242635b0cee0b9deedb4070a62
tree63619b1cbf82629c2813b07094e310e23df0e5cc
parent95da266b86fcdeff84fcadc5e3cde3d0027e571d
Use consistent compatibility checks in vectorizable_shift

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