mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 17:11:20 +08:00
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
This commit is contained in:
parent
63841daf70
commit
f31e515fd5
@ -1,3 +1,11 @@
|
||||
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>
|
||||
|
||||
* read-rtl-function.c
|
||||
|
@ -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,
|
||||
so make sure the scalar is the right type if we are
|
||||
dealing with vectors of long long/long/short/char. */
|
||||
if (dt[1] == vect_constant_def)
|
||||
{
|
||||
if (!slp_node)
|
||||
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);
|
||||
}
|
||||
}
|
||||
incompatible_op1_vectype_p
|
||||
= !tree_nop_conversion_p (TREE_TYPE (vectype),
|
||||
TREE_TYPE (op1));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5819,6 +5807,14 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
|
||||
dump_printf_loc (MSG_NOTE, vect_location,
|
||||
"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. */
|
||||
vec_dest = vect_create_destination_var (scalar_dest, vectype);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user