]> git.ipfire.org Git - thirdparty/gcc.git/commit
ifcvt/vect: Emit COND_OP for conditional scalar reduction.
authorRobin Dapp <rdapp@ventanamicro.com>
Wed, 13 Sep 2023 20:19:35 +0000 (22:19 +0200)
committerRobin Dapp <rdapp@ventanamicro.com>
Thu, 2 Nov 2023 10:48:19 +0000 (11:48 +0100)
commit01c18f58d37865d5f3bbe93e666183b54ec608c7
tree66434b35ac66c8ecc740e1559d249b701fbee6d8
parentc05f748218a0d556972212d6aecfce0eb4c8a31c
ifcvt/vect: Emit COND_OP for conditional scalar reduction.

As described in PR111401 we currently emit a COND and a PLUS expression
for conditional reductions.  This makes it difficult to combine both
into a masked reduction statement later.
This patch improves that by directly emitting a COND_ADD/COND_OP during
ifcvt and adjusting some vectorizer code to handle it.

It also makes neutral_op_for_reduction return -0 if HONOR_SIGNED_ZEROS
is true.

gcc/ChangeLog:

PR middle-end/111401
* internal-fn.cc (internal_fn_else_index): New function.
* internal-fn.h (internal_fn_else_index): Define.
* tree-if-conv.cc (convert_scalar_cond_reduction): Emit COND_OP
if supported.
(predicate_scalar_phi): Add whitespace.
* tree-vect-loop.cc (fold_left_reduction_fn): Add IFN_COND_OP.
(neutral_op_for_reduction): Return -0 for PLUS.
(check_reduction_path): Don't count else operand in COND_OP.
(vect_is_simple_reduction): Ditto.
(vect_create_epilog_for_reduction): Fix whitespace.
(vectorize_fold_left_reduction): Add COND_OP handling.
(vectorizable_reduction): Don't count else operand in COND_OP.
(vect_transform_reduction): Add COND_OP handling.
* tree-vectorizer.h (neutral_op_for_reduction): Add default
parameter.

gcc/testsuite/ChangeLog:

* gcc.dg/vect/vect-cond-reduc-in-order-2-signed-zero.c: New test.
* gcc.target/riscv/rvv/autovec/cond/pr111401.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_call-2.c: Adjust.
* gcc.target/riscv/rvv/autovec/reduc/reduc_call-4.c: Ditto.
gcc/internal-fn.cc
gcc/internal-fn.h
gcc/testsuite/gcc.dg/vect/vect-cond-reduc-in-order-2-signed-zero.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_call-2.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_call-4.c
gcc/tree-if-conv.cc
gcc/tree-vect-loop.cc
gcc/tree-vectorizer.h