tree-optimization/111131 - SLP for non-IFN gathers
commitbeab5b95c581452adeb26efd59ae84a61fb3b429
authorRichard Biener <rguenther@suse.de>
Thu, 19 Oct 2023 08:33:01 +0000 (19 10:33 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 19 Oct 2023 12:25:36 +0000 (19 14:25 +0200)
treeb0140dcd2b7498d1ca1ce58ca6d128a84489bae9
parentb068886dcd7eb4a88dd82643a7a6176215471889
tree-optimization/111131 - SLP for non-IFN gathers

The following implements SLP vectorization support for gathers
without relying on IFNs being pattern detected (and supported by
the target).  That includes support for emulated gathers but also
the legacy x86 builtin path.

PR tree-optimization/111131
* tree-vect-loop.cc (update_epilogue_loop_vinfo): Make
sure to update all gather/scatter stmt DRs, not only those
that eventually got VMAT_GATHER_SCATTER set.
* tree-vect-slp.cc (_slp_oprnd_info::first_gs_info): Add.
(vect_get_and_check_slp_defs): Handle gathers/scatters,
adding the offset as SLP operand and comparing base and scale.
(vect_build_slp_tree_1): Handle gathers.
(vect_build_slp_tree_2): Likewise.

* gcc.dg/vect/vect-gather-1.c: Now expected to vectorize
everywhere.
* gcc.dg/vect/vect-gather-2.c: Expected to not SLP anywhere.
Massage the scale case to more reliably produce a different
one.  Scan for the specific messages.
* gcc.dg/vect/vect-gather-3.c: Masked gather is also supported
for AVX2, but not emulated.
* gcc.dg/vect/vect-gather-4.c: Expected to not SLP anywhere.
Massage to more properly ensure this.
* gcc.dg/vect/tsvc/vect-tsvc-s353.c: Expect to vectorize
everywhere.
gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s353.c
gcc/testsuite/gcc.dg/vect/vect-gather-1.c
gcc/testsuite/gcc.dg/vect/vect-gather-2.c
gcc/testsuite/gcc.dg/vect/vect-gather-3.c
gcc/testsuite/gcc.dg/vect/vect-gather-4.c
gcc/tree-vect-loop.cc
gcc/tree-vect-slp.cc