poly_int: vectorizable_conversion

This patch makes vectorizable_conversion cope with variable-length
vectors.  We already require the number of elements in one vector
to be a multiple of the number of elements in the other vector,
so the patch uses that to choose between widening and narrowing.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* tree-vect-stmts.c (vectorizable_conversion): Treat the number
	of units as polynomial.  Choose between WIDE and NARROW based
	on multiple_p.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r256139
This commit is contained in:
Richard Sandiford 2018-01-03 07:16:28 +00:00 committed by Richard Sandiford
parent cf1b2ba4ea
commit 062d5ccc11
2 changed files with 17 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* tree-vect-stmts.c (vectorizable_conversion): Treat the number
of units as polynomial. Choose between WIDE and NARROW based
on multiple_p.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>

View file

@ -4115,8 +4115,8 @@ vectorizable_conversion (gimple *stmt, gimple_stmt_iterator *gsi,
int ndts = 2;
gimple *new_stmt = NULL;
stmt_vec_info prev_stmt_info;
int nunits_in;
int nunits_out;
poly_uint64 nunits_in;
poly_uint64 nunits_out;
tree vectype_out, vectype_in;
int ncopies, i, j;
tree lhs_type, rhs_type;
@ -4251,12 +4251,15 @@ vectorizable_conversion (gimple *stmt, gimple_stmt_iterator *gsi,
nunits_in = TYPE_VECTOR_SUBPARTS (vectype_in);
nunits_out = TYPE_VECTOR_SUBPARTS (vectype_out);
if (nunits_in < nunits_out)
modifier = NARROW;
else if (nunits_out == nunits_in)
if (known_eq (nunits_out, nunits_in))
modifier = NONE;
else if (multiple_p (nunits_out, nunits_in))
modifier = NARROW;
else
modifier = WIDEN;
{
gcc_checking_assert (multiple_p (nunits_in, nunits_out));
modifier = WIDEN;
}
/* Multiple types in SLP are handled by creating the appropriate number of
vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in