On 11/09/2017 06:24 AM, Richard Sandiford wrote:
> ...so that we can use them for variable-length vectors. For now
> constant-length vectors continue to use VEC_PERM_EXPR and the
> vec_perm_const optab even for cases that the new optabs could
> handle.
>
> The vector optabs are inconsistent about whether there should be
> an underscore before the mode part of the name, but the other lo/hi
> optabs have one.
>
> Doing this means that we're able to optimise some SLP tests using
> non-SLP (for now) on targets with variable-length vectors, so the
> patch needs to add a few XFAILs. Most of these go away with later
> patches.
>
> Tested on aarch64-linux-gnu (with and without SVE), x86_64-linux-gnu
> and powerpc64le-linus-gnu. OK to install?
>
> Richard
>
>
> 2017-11-09 Richard Sandiford <richard.sandif...@linaro.org>
> Alan Hayward <alan.hayw...@arm.com>
> David Sherwood <david.sherw...@arm.com>
>
> gcc/
> * doc/md.texi (vec_reverse, vec_interleave_lo, vec_interleave_hi)
> (vec_extract_even, vec_extract_odd): Document new optabs.
> * internal-fn.def (VEC_INTERLEAVE_LO, VEC_INTERLEAVE_HI)
> (VEC_EXTRACT_EVEN, VEC_EXTRACT_ODD, VEC_REVERSE): New internal
> functions.
> * optabs.def (vec_interleave_lo_optab, vec_interleave_hi_optab)
> (vec_extract_even_optab, vec_extract_odd_optab, vec_reverse_optab):
> New optabs.
> * tree-vect-data-refs.c: Include internal-fn.h.
> (vect_grouped_store_supported): Try using IFN_VEC_INTERLEAVE_{LO,HI}.
> (vect_permute_store_chain): Use them here too.
> (vect_grouped_load_supported): Try using IFN_VEC_EXTRACT_{EVEN,ODD}.
> (vect_permute_load_chain): Use them here too.
> * tree-vect-stmts.c (can_reverse_vector_p): New function.
> (get_negative_load_store_type): Use it.
> (reverse_vector): New function.
> (vectorizable_store, vectorizable_load): Use it.
> * config/aarch64/iterators.md (perm_optab): New iterator.
> * config/aarch64/aarch64-sve.md (<perm_optab>_<mode>): New expander.
> (vec_reverse_<mode>): Likewise.
>
> gcc/testsuite/
> * gcc.dg/vect/no-vfa-vect-depend-2.c: Remove XFAIL.
> * gcc.dg/vect/no-vfa-vect-depend-3.c: Likewise.
> * gcc.dg/vect/pr33953.c: XFAIL for vect_variable_length.
> * gcc.dg/vect/pr68445.c: Likewise.
> * gcc.dg/vect/slp-12a.c: Likewise.
> * gcc.dg/vect/slp-13-big-array.c: Likewise.
> * gcc.dg/vect/slp-13.c: Likewise.
> * gcc.dg/vect/slp-14.c: Likewise.
> * gcc.dg/vect/slp-15.c: Likewise.
> * gcc.dg/vect/slp-42.c: Likewise.
> * gcc.dg/vect/slp-multitypes-2.c: Likewise.
> * gcc.dg/vect/slp-multitypes-4.c: Likewise.
> * gcc.dg/vect/slp-multitypes-5.c: Likewise.
> * gcc.dg/vect/slp-reduc-4.c: Likewise.
> * gcc.dg/vect/slp-reduc-7.c: Likewise.
> * gcc.target/aarch64/sve_vec_perm_2.c: New test.
> * gcc.target/aarch64/sve_vec_perm_2_run.c: Likewise.
> * gcc.target/aarch64/sve_vec_perm_3.c: New test.
> * gcc.target/aarch64/sve_vec_perm_3_run.c: Likewise.
> * gcc.target/aarch64/sve_vec_perm_4.c: New test.
> * gcc.target/aarch64/sve_vec_perm_4_run.c: Likewise.
OK.
jeff