diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-13 17:59:00 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-13 17:59:00 +0000 |
commit | 0972596e6d2573a2c7e922c66b017974ed03ad89 (patch) | |
tree | 6480f2b68dc621ec33ca6970ec346cd38bc3a6a6 /gcc/optabs.def | |
parent | 7cfb4d93595da03abb4e6414758dc98eb7532b34 (diff) | |
download | gcc-0972596e6d2573a2c7e922c66b017974ed03ad89.zip gcc-0972596e6d2573a2c7e922c66b017974ed03ad89.tar.gz gcc-0972596e6d2573a2c7e922c66b017974ed03ad89.tar.bz2 |
Add support for reductions in fully-masked loops
This patch removes the restriction that fully-masked loops cannot
have reductions. The key thing here is to make sure that the
reduction accumulator doesn't include any values associated with
inactive lanes; the patch adds a bunch of conditional binary
operations for doing that.
2018-01-13 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* doc/md.texi (cond_add@var{mode}, cond_sub@var{mode})
(cond_and@var{mode}, cond_ior@var{mode}, cond_xor@var{mode})
(cond_smin@var{mode}, cond_smax@var{mode}, cond_umin@var{mode})
(cond_umax@var{mode}): Document.
* optabs.def (cond_add_optab, cond_sub_optab, cond_and_optab)
(cond_ior_optab, cond_xor_optab, cond_smin_optab, cond_smax_optab)
(cond_umin_optab, cond_umax_optab): New optabs.
* internal-fn.def (COND_ADD, COND_SUB, COND_MIN, COND_MAX, COND_AND)
(COND_IOR, COND_XOR): New internal functions.
* internal-fn.h (get_conditional_internal_fn): Declare.
* internal-fn.c (cond_binary_direct): New macro.
(expand_cond_binary_optab_fn): Likewise.
(direct_cond_binary_optab_supported_p): Likewise.
(get_conditional_internal_fn): New function.
* tree-vect-loop.c (vectorizable_reduction): Handle fully-masked loops.
Cope with reduction statements that are vectorized as calls rather
than assignments.
* config/aarch64/aarch64-sve.md (cond_<optab><mode>): New insns.
* config/aarch64/iterators.md (UNSPEC_COND_ADD, UNSPEC_COND_SUB)
(UNSPEC_COND_SMAX, UNSPEC_COND_UMAX, UNSPEC_COND_SMIN)
(UNSPEC_COND_UMIN, UNSPEC_COND_AND, UNSPEC_COND_ORR)
(UNSPEC_COND_EOR): New unspecs.
(optab): Add mappings for them.
(SVE_COND_INT_OP, SVE_COND_FP_OP): New int iterators.
(sve_int_op, sve_fp_op): New int attributes.
gcc/testsuite/
* gcc.dg/vect/pr60482.c: Remove XFAIL for variable-length vectors.
* gcc.target/aarch64/sve/reduc_1.c: Expect the loop operations
to be predicated.
* gcc.target/aarch64/sve/slp_5.c: Check for a fully-masked loop.
* gcc.target/aarch64/sve/slp_7.c: Likewise.
* gcc.target/aarch64/sve/reduc_5.c: New test.
* gcc.target/aarch64/sve/slp_13.c: Likewise.
* gcc.target/aarch64/sve/slp_13_run.c: Likewise.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256626
Diffstat (limited to 'gcc/optabs.def')
-rw-r--r-- | gcc/optabs.def | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/optabs.def b/gcc/optabs.def index 318a2c7..9a79f4d 100644 --- a/gcc/optabs.def +++ b/gcc/optabs.def @@ -220,6 +220,15 @@ OPTAB_D (addcc_optab, "add$acc") OPTAB_D (negcc_optab, "neg$acc") OPTAB_D (notcc_optab, "not$acc") OPTAB_D (movcc_optab, "mov$acc") +OPTAB_D (cond_add_optab, "cond_add$a") +OPTAB_D (cond_sub_optab, "cond_sub$a") +OPTAB_D (cond_and_optab, "cond_and$a") +OPTAB_D (cond_ior_optab, "cond_ior$a") +OPTAB_D (cond_xor_optab, "cond_xor$a") +OPTAB_D (cond_smin_optab, "cond_smin$a") +OPTAB_D (cond_smax_optab, "cond_smax$a") +OPTAB_D (cond_umin_optab, "cond_umin$a") +OPTAB_D (cond_umax_optab, "cond_umax$a") OPTAB_D (cmov_optab, "cmov$a6") OPTAB_D (cstore_optab, "cstore$a4") OPTAB_D (ctrap_optab, "ctrap$a4") |