aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.h
diff options
context:
space:
mode:
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>2023-07-20 16:51:03 +0800
committerLehua Ding <lehua.ding@rivai.ai>2023-07-24 16:22:30 +0800
commit8390a2af1397ba86ea2cf80d58007b8b69a9a6eb (patch)
treebbc34f4c12f9b78ab7319184a8930ad10ade9161 /gcc/tree-vectorizer.h
parent42b17d00c33dd9994dee973c001d85dc09b79b24 (diff)
downloadgcc-8390a2af1397ba86ea2cf80d58007b8b69a9a6eb.zip
gcc-8390a2af1397ba86ea2cf80d58007b8b69a9a6eb.tar.gz
gcc-8390a2af1397ba86ea2cf80d58007b8b69a9a6eb.tar.bz2
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.
Diffstat (limited to 'gcc/tree-vectorizer.h')
0 files changed, 0 insertions, 0 deletions