Commit 05101d1b by Richard Sandiford Committed by Richard Sandiford

Allow mixed vector sizes within a single vectorised stmt

Although a previous patch allowed mixed vector sizes within a vector
region, we generally still required equal vector sizes within a vector
stmt.  Specifically, vect_get_vector_types_for_stmt computes two vector
types: the vector type corresponding to STMT_VINFO_VECTYPE and the
vector type that determines the minimum vectorisation factor for the
stmt ("nunits_vectype").  It then required these two types to be
the same size.

There doesn't seem to be any need for that restriction though.  AFAICT,
all vectorizable_* functions either do their own compatibility checks
or don't need to do them (because gimple guarantees that the scalar
types are compatible).

It should always be the case that nunits_vectype has at least as many
elements as the other vectype, but that's something we can assert for.

I couldn't resist a couple of other tweaks while there:

- there's no need to compute nunits_vectype if its element type is
  the same as STMT_VINFO_VECTYPE's.

- it's useful to distinguish the nunits_vectype from the main vectype
  in dump messages

- when reusing the existing STMT_VINFO_VECTYPE, it's useful to say so
  in the dump, and say what the type is

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

gcc/
	* tree-vect-stmts.c (vect_get_vector_types_for_stmt): Don't
	require vectype and nunits_vectype to have the same size;
	instead assert that nunits_vectype has at least as many
	elements as vectype.  Don't compute a separate nunits_vectype
	if the scalar type is obviously the same as vectype's.
	Tweak dump messages.

From-SVN: r278244
parent 74166aab
2019-11-14 Richard Sandiford <richard.sandiford@arm.com> 2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmts.c (vect_get_vector_types_for_stmt): Don't
require vectype and nunits_vectype to have the same size;
instead assert that nunits_vectype has at least as many
elements as vectype. Don't compute a separate nunits_vectype
if the scalar type is obviously the same as vectype's.
Tweak dump messages.
2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
* config/aarch64/aarch64.c (aarch64_vectorize_related_mode): New * config/aarch64/aarch64.c (aarch64_vectorize_related_mode): New
function. function.
(aarch64_autovectorize_vector_modes): Also add V4HImode and V2SImode. (aarch64_autovectorize_vector_modes): Also add V4HImode and V2SImode.
...@@ -12018,7 +12018,12 @@ vect_get_vector_types_for_stmt (stmt_vec_info stmt_info, ...@@ -12018,7 +12018,12 @@ vect_get_vector_types_for_stmt (stmt_vec_info stmt_info,
tree vectype; tree vectype;
tree scalar_type = NULL_TREE; tree scalar_type = NULL_TREE;
if (STMT_VINFO_VECTYPE (stmt_info)) if (STMT_VINFO_VECTYPE (stmt_info))
*stmt_vectype_out = vectype = STMT_VINFO_VECTYPE (stmt_info); {
*stmt_vectype_out = vectype = STMT_VINFO_VECTYPE (stmt_info);
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
"precomputed vectype: %T\n", vectype);
}
else else
{ {
gcc_assert (!STMT_VINFO_DATA_REF (stmt_info)); gcc_assert (!STMT_VINFO_DATA_REF (stmt_info));
...@@ -12050,7 +12055,7 @@ vect_get_vector_types_for_stmt (stmt_vec_info stmt_info, ...@@ -12050,7 +12055,7 @@ vect_get_vector_types_for_stmt (stmt_vec_info stmt_info,
if (dump_enabled_p ()) if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location, dump_printf_loc (MSG_NOTE, vect_location,
"get vectype for scalar type: %T\n", scalar_type); "get vectype for scalar type: %T\n", scalar_type);
vectype = get_vectype_for_scalar_type (vinfo, scalar_type); vectype = get_vectype_for_scalar_type (vinfo, scalar_type);
if (!vectype) if (!vectype)
return opt_result::failure_at (stmt, return opt_result::failure_at (stmt,
...@@ -12067,42 +12072,38 @@ vect_get_vector_types_for_stmt (stmt_vec_info stmt_info, ...@@ -12067,42 +12072,38 @@ vect_get_vector_types_for_stmt (stmt_vec_info stmt_info,
/* Don't try to compute scalar types if the stmt produces a boolean /* Don't try to compute scalar types if the stmt produces a boolean
vector; use the existing vector type instead. */ vector; use the existing vector type instead. */
tree nunits_vectype; tree nunits_vectype = vectype;
if (VECTOR_BOOLEAN_TYPE_P (vectype)) if (!VECTOR_BOOLEAN_TYPE_P (vectype)
nunits_vectype = vectype; && *stmt_vectype_out != boolean_type_node)
else
{ {
/* The number of units is set according to the smallest scalar /* The number of units is set according to the smallest scalar
type (or the largest vector size, but we only support one type (or the largest vector size, but we only support one
vector size per vectorization). */ vector size per vectorization). */
if (*stmt_vectype_out != boolean_type_node) HOST_WIDE_INT dummy;
scalar_type = vect_get_smallest_scalar_type (stmt_info, &dummy, &dummy);
if (scalar_type != TREE_TYPE (vectype))
{ {
HOST_WIDE_INT dummy; if (dump_enabled_p ())
scalar_type = vect_get_smallest_scalar_type (stmt_info, dump_printf_loc (MSG_NOTE, vect_location,
&dummy, &dummy); "get vectype for smallest scalar type: %T\n",
scalar_type);
nunits_vectype = get_vectype_for_scalar_type (vinfo, scalar_type);
if (!nunits_vectype)
return opt_result::failure_at
(stmt, "not vectorized: unsupported data-type %T\n",
scalar_type);
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location, "nunits vectype: %T\n",
nunits_vectype);
} }
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
"get vectype for scalar type: %T\n", scalar_type);
nunits_vectype = get_vectype_for_scalar_type (vinfo, scalar_type);
} }
if (!nunits_vectype)
return opt_result::failure_at (stmt,
"not vectorized: unsupported data-type %T\n",
scalar_type);
if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (vectype)), gcc_assert (*stmt_vectype_out == boolean_type_node
GET_MODE_SIZE (TYPE_MODE (nunits_vectype)))) || multiple_p (TYPE_VECTOR_SUBPARTS (nunits_vectype),
return opt_result::failure_at (stmt, TYPE_VECTOR_SUBPARTS (*stmt_vectype_out)));
"not vectorized: different sized vector "
"types in statement, %T and %T\n",
vectype, nunits_vectype);
if (dump_enabled_p ()) if (dump_enabled_p ())
{ {
dump_printf_loc (MSG_NOTE, vect_location, "vectype: %T\n",
nunits_vectype);
dump_printf_loc (MSG_NOTE, vect_location, "nunits = "); dump_printf_loc (MSG_NOTE, vect_location, "nunits = ");
dump_dec (MSG_NOTE, TYPE_VECTOR_SUBPARTS (nunits_vectype)); dump_dec (MSG_NOTE, TYPE_VECTOR_SUBPARTS (nunits_vectype));
dump_printf (MSG_NOTE, "\n"); dump_printf (MSG_NOTE, "\n");
......
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