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
Showing
Please
register
or
sign in
to comment