On 11/28/2017 11:09 AM, Richard Sandiford wrote: > Jeff Law <l...@redhat.com> writes: >> On 10/23/2017 11:30 AM, Richard Sandiford wrote: >>> 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. >>> >>> >>> 2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> >>> Alan Hayward <alan.hayw...@arm.com> >>> David Sherwood <david.sherw...@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. >> If I'm reding this right, if nunits_in < nunits_out, but the latter is >> not a multiple of the former, we'll choose WIDEN, which is the opposite >> of what we'd do before this patch. Was that intentional? > > That case isn't possible, so we'd assert: > > if (must_eq (nunits_out, nunits_in)) > modifier = NONE; > else if (multiple_p (nunits_out, nunits_in)) > modifier = NARROW; > else > { > gcc_checking_assert (multiple_p (nunits_in, nunits_out)); > modifier = WIDEN; > } > > We already implicitly rely on this, since we either widen one full > vector to N full vectors or narrow N full vectors to one vector. > > Structurally this is enforced by all vectors having the same number of > bytes (current_vector_size) and the number of vector elements being a > power of 2 (or in the case of poly_int, a power of 2 times a runtime > variant, but that's good enough, since the runtime invariant is the same > in both cases). OK. THanks for clarifying.
jeff