]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Support in-order floating-point reduction
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Thu, 20 Jul 2023 08:51:03 +0000 (16:51 +0800)
committerLehua Ding <lehua.ding@rivai.ai>
Mon, 24 Jul 2023 08:22:30 +0000 (16:22 +0800)
commit8390a2af1397ba86ea2cf80d58007b8b69a9a6eb
treebbc34f4c12f9b78ab7319184a8930ad10ade9161
parent42b17d00c33dd9994dee973c001d85dc09b79b24
RISC-V: Support in-order floating-point reduction

This patch is depending on:
https://gcc.gnu.org/pipermail/gcc-patches/2023-July/624995.html

Consider this following case:
float foo (float *__restrict a, int n)
{
  float result = 1.0;
  for (int i = 0; i < n; i++)
   result += a[i];
  return result;
}

Compile with **NO** -ffast-math:

Before this patch:
<source>:4:21: missed: couldn't vectorize loop
<source>:1:7: missed: not vectorized: relevant phi not supported: result_14 = PHI <result_11(6), 1.0e+0(5)>

After this patch:
foo:
lui a5,%hi(.LC0)
flw fa0,%lo(.LC0)(a5)
ble a1,zero,.L4
.L3:
vsetvli a5,a1,e32,m1,ta,ma
vle32.v v1,0(a0)
slli a4,a5,2
sub a1,a1,a5
vfmv.s.f v2,fa0
add a0,a0,a4
vfredosum.vs v1,v1,v2     ----------> FOLD_LEFT_PLUS
vfmv.f.s fa0,v1
bne a1,zero,.L3
ret
.L4:
ret

gcc/ChangeLog:

* config/riscv/autovec.md (fold_left_plus_<mode>): New pattern.
(mask_len_fold_left_plus_<mode>): Ditto.
* config/riscv/riscv-protos.h (enum insn_type): New enum.
(enum reduction_type): Ditto.
(expand_reduction): Add in-order reduction.
* config/riscv/riscv-v.cc (emit_nonvlmax_fp_reduction_insn): New function.
(expand_reduction): Add in-order reduction.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-1.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-2.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-3.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-4.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-5.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-6.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict-7.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict_run-1.c: New test.
* gcc.target/riscv/rvv/autovec/reduc/reduc_strict_run-2.c: New test.
12 files changed:
gcc/config/riscv/autovec.md
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv-v.cc
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict_run-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_strict_run-2.c [new file with mode: 0644]