This shows a more complicated case to defend against invariant
computations inside the loop. There's no easy place to stick LIM
apart from adding a separate pass which then could be disabled,
re-creating the issue. As the issue at hand appears in a pattern
stmt it's also not possible to address this in SLP discovery,
promoting fully invariant expressions to externs.
Meaning the following attempts to handle excess (zero-padded)
input lanes in vectoriable_lane_reducing and the transform
stage, vect_transform_reduction.
As usual we ICE in vect_get_num_copies and the transform stage
already has other means of obtaining the actual number of input
vectors, so the first patch refactors things to avoid the former.
Then there's vect_reduction_update_partial_vector_usage which
might be bogus (but on the caller side), I have refactored things
to make targeted fixes easier if necessary. The
vectoriable_lane_reducing case looks correct where we pair
the input vector type with the number of input vectors. The
vectorizable_reduction case looks questionable, but possibly
vectype_in is always equal (in lanes) to vectype so it doesn't
matter.
The last patch is the fix for vectoriable_lane_reducing which
I make matching the transform phase - look at the actual
(expected) number of input vectors.
What I did not check (due to lack of a testcase) is whether
we can actually zero-fill variable-length vectors.
vect_create_constant_vectors for those adjusts nunits and
so possibly
a) breaks my number_of_places_left_in_vector logic
for the padding,
b) will eventually use duplicate_and_interleave,
but we never checked that for the zero-padding part(?)
(IMO we should, even if redundantly, verify this in
vect_slp_analyze_node_operations where we verify
vect_get_num_copies_for_invariant)
c) the permute_results[] caching might be disrupted?
at this point I'm hoping for test coverage.
I need to investigate some fallout, but appreciate some feedback
on the VLA vector things above.
Thanks,
Richard.
Richard Biener (3):
Simplify vect_transform_reduction
Refactor vect_reduction_update_partial_vector_usage
tree-optimization/126998 - avoid vect_get_num_copies on SLP inputs
.../gcc.dg/vect/vect-reduc-dot-pr126998.c | 36 ++++++
gcc/tree-vect-loop.cc | 117 +++++++-----------
gcc/tree-vect-slp.cc | 2 +-
gcc/tree-vectorizer.h | 2 +
4 files changed, 85 insertions(+), 72 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-reduc-dot-pr126998.c
--
2.51.0