aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>2023-09-12 19:00:25 +0800
committerPan Li <pan2.li@intel.com>2023-09-12 19:32:26 +0800
commitaf6d089b4ded96b529c7063bd7873e4630a3a64d (patch)
treedbc5a45d993f0b0199d999108b6b9637c4992c56 /gcc/go
parentb24fd3bccf76821b46c52cf375e460b7e64d4139 (diff)
downloadgcc-af6d089b4ded96b529c7063bd7873e4630a3a64d.zip
gcc-af6d089b4ded96b529c7063bd7873e4630a3a64d.tar.gz
gcc-af6d089b4ded96b529c7063bd7873e4630a3a64d.tar.bz2
RISC-V: Support Dynamic LMUL Cost model
This patch support dynamic LMUL cost modeling with --param=riscv-autovec-lmul=dynamic. Consider this following case: void foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c, int32_t *__restrict a2, int32_t *__restrict b2, int32_t *__restrict c2, int32_t *__restrict a3, int32_t *__restrict b3, int32_t *__restrict c3, int32_t *__restrict a4, int32_t *__restrict b4, int32_t *__restrict c4, int32_t *__restrict a5, int32_t *__restrict b5, int32_t *__restrict c5, int32_t *__restrict d, int32_t *__restrict d2, int32_t *__restrict d3, int32_t *__restrict d4, int32_t *__restrict d5, int n) { for (int i = 0; i < n; i++) { a[i] = b[i] + c[i]; b5[i] = b[i] + c[i]; a2[i] = b2[i] + c2[i]; a3[i] = b3[i] + c3[i]; a4[i] = b4[i] + c4[i]; a5[i] = a[i] + a4[i]; d2[i] = a2[i] + c2[i]; d3[i] = a3[i] + c3[i]; d4[i] = a4[i] + c4[i]; d5[i] = a[i] + a4[i]; a[i] = a5[i] + b5[i] + a[i]; c2[i] = a[i] + c[i]; c3[i] = b5[i] * a5[i]; c4[i] = a2[i] * a3[i]; c5[i] = b5[i] * a2[i]; c[i] = a[i] + c3[i]; c2[i] = a[i] + c4[i]; a5[i] = a[i] + a4[i]; a[i] = a[i] + b5[i] + a[i] * a2[i] * a3[i] * a4[i] * a5[i] * c[i] * c2[i] * c3[i] * c4[i] * c5[i] * d[i] * d2[i] * d3[i] * d4[i] * d5[i]; } } Demo: https://godbolt.org/z/x1acoMxGT You can see it will produce register spilling if you specify LMUL >= 4 Now, with --param=riscv-autovec-lmul=dynamic. GCC is able to pick LMUL = 2 to optimized this case. This feature is supported by linear scan based local live ranges analysis and compute maximum live V_REGS in specific program point of the function to determine the VF/LMUL. Note that this patch can well handle both SLP and non-SLP loop. Currenty approach didn't consider the later instruction scheduler which may improve the register pressure. In this case, we are conservatively applying smaller VF/LMUL. (Not sure whether we should support live range shrink for such corner case since we don't known whether it can improve performance a lot.) gcc/ChangeLog: * config/riscv/riscv-vector-costs.cc (get_last_live_range): New function. (compute_nregs_for_mode): Ditto. (live_range_conflict_p): Ditto. (max_number_of_live_regs): Ditto. (compute_lmul): Ditto. (costs::prefer_new_lmul_p): Ditto. (costs::better_main_loop_than_p): Ditto. * config/riscv/riscv-vector-costs.h (struct stmt_point): New struct. (struct var_live_range): Ditto. (struct autovec_info): Ditto. * config/riscv/t-riscv: Update makefile for COST model. gcc/testsuite/ChangeLog: * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-6.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-4.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/rvv-costmodel-vect.exp: New test.
Diffstat (limited to 'gcc/go')
0 files changed, 0 insertions, 0 deletions