vect: Don't pattern match BITFIELD_REF's of non-integrals [PR107226]

The original patch supported matching the vect_recog_bitfield_ref_pattern for
BITFIELD_REF's where the first operand didn't have a INTEGRAL_TYPE_P type.
That means it would also match vectors, leading to regressions in targets that
supported vectorization of those.

gcc/ChangeLog:

	PR tree-optimization/107226
	* tree-vect-patterns.cc (vect_recog_bitfield_ref_pattern): Reject
	BITFIELD_REF's with non integral typed first operands.
This commit is contained in:
Andre Vieira 2022-10-13 10:34:27 +01:00
parent 7c059880fc
commit 7f9a7465c8

View file

@ -1913,6 +1913,7 @@ vect_recog_bitfield_ref_pattern (vec_info *vinfo, stmt_vec_info stmt_info,
return NULL;
if (!INTEGRAL_TYPE_P (TREE_TYPE (bf_ref))
|| !INTEGRAL_TYPE_P (TREE_TYPE (container))
|| TYPE_MODE (TREE_TYPE (container)) == E_BLKmode)
return NULL;
@ -1921,25 +1922,7 @@ vect_recog_bitfield_ref_pattern (vec_info *vinfo, stmt_vec_info stmt_info,
tree ret = gimple_assign_lhs (first_stmt);
tree ret_type = TREE_TYPE (ret);
bool shift_first = true;
tree vectype;
/* If the first operand of the BIT_FIELD_REF is not an INTEGER type, convert
it to one of the same width so we can perform the necessary masking and
shifting. */
if (!INTEGRAL_TYPE_P (TREE_TYPE (container)))
{
unsigned HOST_WIDE_INT container_size =
tree_to_uhwi (TYPE_SIZE (TREE_TYPE (container)));
tree int_type = build_nonstandard_integer_type (container_size, true);
pattern_stmt
= gimple_build_assign (vect_recog_temp_ssa_var (int_type),
VIEW_CONVERT_EXPR, container);
vectype = get_vectype_for_scalar_type (vinfo, int_type);
container = gimple_assign_lhs (pattern_stmt);
append_pattern_def_seq (vinfo, stmt_info, pattern_stmt, vectype);
}
else
vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (container));
tree vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (container));
/* We move the conversion earlier if the loaded type is smaller than the
return type to enable the use of widening loads. */