vect: Add support for fmax and fmin reductions
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 30 Nov 2021 09:52:25 +0000 (09:52 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 30 Nov 2021 09:52:25 +0000 (09:52 +0000)
commite32b9eb32d7cd2d39bf9c70497890ac61b9ee14c
tree3f4188ad4a2fc980f1b134c4f0137c3aba7947d9
parent30213ae9a2eb53f6bc0913919457ceae2572b019
vect: Add support for fmax and fmin reductions

This patch adds support for reductions involving calls to fmax*()
and fmin*(), without the -ffast-math flags that allow them to be
converted to MAX_EXPR and MIN_EXPR.

gcc/
* doc/md.texi (reduc_fmin_scal_@var{m}): Document.
(reduc_fmax_scal_@var{m}): Likewise.
* optabs.def (reduc_fmax_scal_optab): New optab.
(reduc_fmin_scal_optab): Likewise
* internal-fn.def (REDUC_FMAX, REDUC_FMIN): New functions.
* tree-vect-loop.c (reduction_fn_for_scalar_code): Handle
CASE_CFN_FMAX and CASE_CFN_FMIN.
(neutral_op_for_reduction): Likewise.
(needs_fold_left_reduction_p): Likewise.
* config/aarch64/iterators.md (FMAXMINV): New iterator.
(fmaxmin): Handle UNSPEC_FMAXNMV and UNSPEC_FMINNMV.
* config/aarch64/aarch64-simd.md (reduc_<optab>_scal_<mode>): Fix
unspec mode.
(reduc_<fmaxmin>_scal_<mode>): New pattern.
* config/aarch64/aarch64-sve.md (reduc_<fmaxmin>_scal_<mode>):
Likewise.

gcc/testsuite/
* gcc.dg/vect/vect-fmax-1.c: New test.
* gcc.dg/vect/vect-fmax-2.c: Likewise.
* gcc.dg/vect/vect-fmax-3.c: Likewise.
* gcc.dg/vect/vect-fmin-1.c: New test.
* gcc.dg/vect/vect-fmin-2.c: Likewise.
* gcc.dg/vect/vect-fmin-3.c: Likewise.
* gcc.target/aarch64/fmaxnm_1.c: Likewise.
* gcc.target/aarch64/fmaxnm_2.c: Likewise.
* gcc.target/aarch64/fminnm_1.c: Likewise.
* gcc.target/aarch64/fminnm_2.c: Likewise.
* gcc.target/aarch64/sve/fmaxnm_2.c: Likewise.
* gcc.target/aarch64/sve/fmaxnm_3.c: Likewise.
* gcc.target/aarch64/sve/fminnm_2.c: Likewise.
* gcc.target/aarch64/sve/fminnm_3.c: Likewise.
21 files changed:
gcc/config/aarch64/aarch64-simd.md
gcc/config/aarch64/aarch64-sve.md
gcc/config/aarch64/iterators.md
gcc/doc/md.texi
gcc/internal-fn.def
gcc/optabs.def
gcc/testsuite/gcc.dg/vect/vect-fmax-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-fmax-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-fmax-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-fmin-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-fmin-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-fmin-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/fmaxnm_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/fmaxnm_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/fminnm_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/fminnm_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/fmaxnm_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/fmaxnm_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/fminnm_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/fminnm_3.c [new file with mode: 0644]
gcc/tree-vect-loop.c