aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.h
diff options
context:
space:
mode:
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>2023-08-03 09:58:35 +0800
committerPan Li <pan2.li@intel.com>2023-08-08 21:07:56 +0800
commit6ae5565e78c96868ea6f9a7bb38767b3800d22c9 (patch)
tree0c07fadea1d0658539fd9b6607ff500b0db3eed6 /gcc/tree-vectorizer.h
parentd9f3ea61fe36e2de3354b90b65ff8245099114c9 (diff)
downloadgcc-6ae5565e78c96868ea6f9a7bb38767b3800d22c9.zip
gcc-6ae5565e78c96868ea6f9a7bb38767b3800d22c9.tar.gz
gcc-6ae5565e78c96868ea6f9a7bb38767b3800d22c9.tar.bz2
RISC-V: Support CALL conditional autovec patterns
This patch is depending on middle-end patch on vectorizable_call. Consider this following case: void foo (float * __restrict a, float * __restrict b, int * __restrict cond, int n) { for (int i = 0; i < n; i++) if (cond[i]) a[i] = b[i] + a[i]; } Before this patch (**NO** -ffast-math): <source>:5:21: missed: couldn't vectorize loop <source>:5:21: missed: not vectorized: control flow in loop. After this patch: foo: ble a3,zero,.L5 mv a6,a0 .L3: vsetvli a5,a3,e8,mf4,ta,ma vle32.v v0,0(a2) vsetvli a7,zero,e32,m1,ta,ma slli a4,a5,2 vmsne.vi v0,v0,0 sub a3,a3,a5 vsetvli zero,a5,e32,m1,tu,mu ------> must be TUMU vle32.v v2,0(a0),v0.t vle32.v v1,0(a1),v0.t vfadd.vv v1,v1,v2,v0.t ------> generated by COND_LEN_ADD with real mask and len. vse32.v v1,0(a6),v0.t add a2,a2,a4 add a1,a1,a4 add a0,a0,a4 add a6,a6,a4 bne a3,zero,.L3 .L5: ret gcc/ChangeLog: * config/riscv/autovec.md (cond_<optab><mode>): New pattern. (cond_len_<optab><mode>): Ditto. (cond_fma<mode>): Ditto. (cond_len_fma<mode>): Ditto. (cond_fnma<mode>): Ditto. (cond_len_fnma<mode>): Ditto. (cond_fms<mode>): Ditto. (cond_len_fms<mode>): Ditto. (cond_fnms<mode>): Ditto. (cond_len_fnms<mode>): Ditto. * config/riscv/riscv-protos.h (riscv_get_v_regno_alignment): Export global. (enum insn_type): Add new enum type. (prepare_ternary_operands): New function. * config/riscv/riscv-v.cc (emit_vlmax_masked_fp_mu_insn): Ditto. (emit_nonvlmax_tumu_insn): Ditto. (emit_nonvlmax_fp_tumu_insn): Ditto. (expand_cond_len_binop): Add condtional operations. (expand_cond_len_ternop): Ditto. (prepare_ternary_operands): New function. * config/riscv/riscv.cc (riscv_memmodel_needs_amo_release): Export riscv_get_v_regno_alignment as global scope. * config/riscv/vector.md: Fix ternary bugs. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/rvv.exp: Add condition tests. * gcc.target/riscv/rvv/autovec/cond/cond_arith-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-7.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-8.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith-9.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-7.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-8.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_arith_run-9.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fadd_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-7.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-8.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-7.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma_run-8.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmax_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmin_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms_run-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms_run-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_fmul_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_logical_run-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-7.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-8.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift-9.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-2.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-3.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-4.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-5.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-6.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-7.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-8.c: New test. * gcc.target/riscv/rvv/autovec/cond/cond_shift_run-9.c: New test. * gcc.target/riscv/rvv/autovec/reduc/reduc_call-1.c: New test. * gcc.target/riscv/rvv/autovec/reduc/reduc_call-2.c: New test. * gcc.target/riscv/rvv/autovec/reduc/reduc_call-3.c: New test. * gcc.target/riscv/rvv/autovec/reduc/reduc_call-4.c: New test. * gcc.target/riscv/rvv/autovec/reduc/reduc_call-5.c: New test.
Diffstat (limited to 'gcc/tree-vectorizer.h')
0 files changed, 0 insertions, 0 deletions