Commit f31e515f by Richard Sandiford Committed by Richard Sandiford

Fix vector/scalar to vector/vector conversion (PR92515)

r278235 broke conversions of vector/scalar shifts into vector/vector
shifts on targets that only provide the latter.  We need to record
whether a conversion is required in that case too.

Also, the old useless_type_conversion_p condition seemed unnecessarily
strong, since the shift amount can have a different signedness from
the shifted value and its vector type is never assumed to be identical
to vectype.  The patch therefore uses tree_nop_conversion_p instead.

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

gcc/
	PR tree-optimization/92515
	* tree-vect-stmts.c (vectorizable_shift): Record incompatible op1
	types when converting a vector/scalar shift into a vector/vector one,
	using tree_nop_conversion_p instead of useless_type_conversion_p.
	Move the conversion code to the transform block.

From-SVN: r278295
parent 63841daf
2019-11-15 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/92515
* tree-vect-stmts.c (vectorizable_shift): Record incompatible op1
types when converting a vector/scalar shift into a vector/vector one,
using tree_nop_conversion_p instead of useless_type_conversion_p.
Move the conversion code to the transform block.
2019-11-15 Matthew Malcomson <matthew.malcomson@arm.com> 2019-11-15 Matthew Malcomson <matthew.malcomson@arm.com>
* read-rtl-function.c * read-rtl-function.c
...@@ -5750,21 +5750,9 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, ...@@ -5750,21 +5750,9 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
the rhs being int, instead of the same type as the lhs, the rhs being int, instead of the same type as the lhs,
so make sure the scalar is the right type if we are so make sure the scalar is the right type if we are
dealing with vectors of long long/long/short/char. */ dealing with vectors of long long/long/short/char. */
if (dt[1] == vect_constant_def) incompatible_op1_vectype_p
{ = !tree_nop_conversion_p (TREE_TYPE (vectype),
if (!slp_node) TREE_TYPE (op1));
op1 = fold_convert (TREE_TYPE (vectype), op1);
}
else if (!useless_type_conversion_p (TREE_TYPE (vectype),
TREE_TYPE (op1)))
{
if (vec_stmt && !slp_node)
{
op1 = fold_convert (TREE_TYPE (vectype), op1);
op1 = vect_init_vector (stmt_info, op1,
TREE_TYPE (vectype), NULL);
}
}
} }
} }
} }
...@@ -5819,6 +5807,14 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, ...@@ -5819,6 +5807,14 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
dump_printf_loc (MSG_NOTE, vect_location, dump_printf_loc (MSG_NOTE, vect_location,
"transform binary/unary operation.\n"); "transform binary/unary operation.\n");
if (incompatible_op1_vectype_p && !slp_node)
{
op1 = fold_convert (TREE_TYPE (vectype), op1);
if (dt[1] != vect_constant_def)
op1 = vect_init_vector (stmt_info, op1,
TREE_TYPE (vectype), NULL);
}
/* Handle def. */ /* Handle def. */
vec_dest = vect_create_destination_var (scalar_dest, vectype); vec_dest = vect_create_destination_var (scalar_dest, vectype);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment