RE: Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS]
Thanks Jeff. Ported to gcc-13 with minor changes to test cases. Pan -Original Message- From: Gcc-patches On Behalf Of juzhe.zh...@rivai.ai Sent: Thursday, August 10, 2023 8:50 AM To: jeffreyalaw ; gcc-patches Cc: kito.cheng ; Kito.cheng ; Robin Dapp Subject: Re: Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS] Yes. I think so. Will backport GCC 13 soon. juzhe.zh...@rivai.ai From: Jeff Law Date: 2023-08-10 01:01 To: Juzhe-Zhong; gcc-patches CC: kito.cheng; kito.cheng; rdapp.gcc Subject: Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS] On 8/9/23 04:51, Juzhe-Zhong wrote: > Realize we have a bug in VSETVL PASS which is triggered by > strided_load_run-1.c in RV32 system. > > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > > This is because VSETVL PASS incorrect hoist vsetvl instruction: > > ... > 10156: 0d9075d7 vsetvli a1,zero,e64,m2,ta,ma ---> pollute 'a1' > register which will be used by following insns. > 1015a: 01d586b3 add a3,a1,t4 > use 'a1' > 1015e: 5e070257 vmv.v.v v4,v14 > 10162: b7032257 vmacc.vv v4,v6,v16 > 10166: 26440257 vand.vv v4,v4,v8 > 1016a: 22880227 vs2r.v v4,(a6) > 1016e: 00b6b7b3 sltu a5,a3,a1 > 10172: 22888227 vs2r.v v4,(a7) > 10176: 9e60b157 vmv2r.v v2,v6 > 1017a: 97baadd a5,a5,a4 > 1017c: a6a62157 vmadd.vv v2,v12,v10 > 10180: 26240157 vand.vv v2,v2,v8 > 10184: 22830127 vs2r.v v2,(t1) > 10188: 873emv a4,a5 > 1018a: 982aadd a6,a6,a0 > 1018c: 98aaadd a7,a7,a0 > 1018e: 932aadd t1,t1,a0 > 10190: 85b6mv a1,a3 -> set 'a1' > ... > > gcc/ChangeLog: > > * config/riscv/riscv-vsetvl.cc (anticipatable_occurrence_p): Fix > incorrect anticipate info. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c: > Adapt test. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-26.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-36.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c: Ditto. OK. Do we need to backport this to gcc-13? jeff
Re: Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS]
Yes. I think so. Will backport GCC 13 soon. juzhe.zh...@rivai.ai From: Jeff Law Date: 2023-08-10 01:01 To: Juzhe-Zhong; gcc-patches CC: kito.cheng; kito.cheng; rdapp.gcc Subject: Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS] On 8/9/23 04:51, Juzhe-Zhong wrote: > Realize we have a bug in VSETVL PASS which is triggered by > strided_load_run-1.c in RV32 system. > > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > > This is because VSETVL PASS incorrect hoist vsetvl instruction: > > ... > 10156: 0d9075d7 vsetvli a1,zero,e64,m2,ta,ma ---> pollute 'a1' > register which will be used by following insns. > 1015a: 01d586b3 add a3,a1,t4 > use 'a1' > 1015e: 5e070257 vmv.v.v v4,v14 > 10162: b7032257 vmacc.vv v4,v6,v16 > 10166: 26440257 vand.vv v4,v4,v8 > 1016a: 22880227 vs2r.v v4,(a6) > 1016e: 00b6b7b3 sltu a5,a3,a1 > 10172: 22888227 vs2r.v v4,(a7) > 10176: 9e60b157 vmv2r.v v2,v6 > 1017a: 97baadd a5,a5,a4 > 1017c: a6a62157 vmadd.vv v2,v12,v10 > 10180: 26240157 vand.vv v2,v2,v8 > 10184: 22830127 vs2r.v v2,(t1) > 10188: 873emv a4,a5 > 1018a: 982aadd a6,a6,a0 > 1018c: 98aaadd a7,a7,a0 > 1018e: 932aadd t1,t1,a0 > 10190: 85b6mv a1,a3 -> set 'a1' > ... > > gcc/ChangeLog: > > * config/riscv/riscv-vsetvl.cc (anticipatable_occurrence_p): Fix > incorrect anticipate info. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c: > Adapt test. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-26.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-36.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c: Ditto. OK. Do we need to backport this to gcc-13? jeff
RE: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS]
Committed to trunk, thanks Jeff. Pan -Original Message- From: Gcc-patches On Behalf Of Jeff Law via Gcc-patches Sent: Thursday, August 10, 2023 1:01 AM To: Juzhe-Zhong ; gcc-patches@gcc.gnu.org Cc: kito.ch...@gmail.com; kito.ch...@sifive.com; rdapp@gmail.com Subject: Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS] On 8/9/23 04:51, Juzhe-Zhong wrote: > Realize we have a bug in VSETVL PASS which is triggered by > strided_load_run-1.c in RV32 system. > > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c > execution test > > This is because VSETVL PASS incorrect hoist vsetvl instruction: > > ... > 10156:0d9075d7vsetvli a1,zero,e64,m2,ta,ma ---> > pollute 'a1' register which will be used by following insns. > 1015a:01d586b3add a3,a1,t4 > use 'a1' > 1015e:5e070257vmv.v.v v4,v14 > 10162:b7032257vmacc.vvv4,v6,v16 > 10166:26440257vand.vv v4,v4,v8 > 1016a:22880227vs2r.v v4,(a6) > 1016e:00b6b7b3sltua5,a3,a1 > 10172:22888227vs2r.v v4,(a7) > 10176:9e60b157vmv2r.v v2,v6 > 1017a:97baadd a5,a5,a4 > 1017c:a6a62157vmadd.vvv2,v12,v10 > 10180:26240157vand.vv v2,v2,v8 > 10184:22830127vs2r.v v2,(t1) > 10188:873emv a4,a5 > 1018a:982aadd a6,a6,a0 > 1018c:98aaadd a7,a7,a0 > 1018e:932aadd t1,t1,a0 > 10190:85b6mv a1,a3 -> set 'a1' > ... > > gcc/ChangeLog: > > * config/riscv/riscv-vsetvl.cc (anticipatable_occurrence_p): Fix > incorrect anticipate info. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c: > Adapt test. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-26.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-36.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c: Ditto. > * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c: Ditto. OK. Do we need to backport this to gcc-13? jeff
Re: [PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS]
On 8/9/23 04:51, Juzhe-Zhong wrote: Realize we have a bug in VSETVL PASS which is triggered by strided_load_run-1.c in RV32 system. FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test This is because VSETVL PASS incorrect hoist vsetvl instruction: ... 10156: 0d9075d7vsetvli a1,zero,e64,m2,ta,ma ---> pollute 'a1' register which will be used by following insns. 1015a: 01d586b3add a3,a1,t4 > use 'a1' 1015e: 5e070257vmv.v.v v4,v14 10162: b7032257vmacc.vvv4,v6,v16 10166: 26440257vand.vv v4,v4,v8 1016a: 22880227vs2r.v v4,(a6) 1016e: 00b6b7b3sltua5,a3,a1 10172: 22888227vs2r.v v4,(a7) 10176: 9e60b157vmv2r.v v2,v6 1017a: 97baadd a5,a5,a4 1017c: a6a62157vmadd.vvv2,v12,v10 10180: 26240157vand.vv v2,v2,v8 10184: 22830127vs2r.v v2,(t1) 10188: 873emv a4,a5 1018a: 982aadd a6,a6,a0 1018c: 98aaadd a7,a7,a0 1018e: 932aadd t1,t1,a0 10190: 85b6mv a1,a3 -> set 'a1' ... gcc/ChangeLog: * config/riscv/riscv-vsetvl.cc (anticipatable_occurrence_p): Fix incorrect anticipate info. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c: Adapt test. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-26.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-36.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c: Ditto. OK. Do we need to backport this to gcc-13? jeff
[PATCH] RISC-V: Fix VLMAX AVL incorrect local anticipate [VSETVL PASS]
Realize we have a bug in VSETVL PASS which is triggered by strided_load_run-1.c in RV32 system. FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test FAIL: gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c execution test This is because VSETVL PASS incorrect hoist vsetvl instruction: ... 10156: 0d9075d7vsetvli a1,zero,e64,m2,ta,ma ---> pollute 'a1' register which will be used by following insns. 1015a: 01d586b3add a3,a1,t4 > use 'a1' 1015e: 5e070257vmv.v.v v4,v14 10162: b7032257vmacc.vvv4,v6,v16 10166: 26440257vand.vv v4,v4,v8 1016a: 22880227vs2r.v v4,(a6) 1016e: 00b6b7b3sltua5,a3,a1 10172: 22888227vs2r.v v4,(a7) 10176: 9e60b157vmv2r.v v2,v6 1017a: 97baadd a5,a5,a4 1017c: a6a62157vmadd.vvv2,v12,v10 10180: 26240157vand.vv v2,v2,v8 10184: 22830127vs2r.v v2,(t1) 10188: 873emv a4,a5 1018a: 982aadd a6,a6,a0 1018c: 98aaadd a7,a7,a0 1018e: 932aadd t1,t1,a0 10190: 85b6mv a1,a3 -> set 'a1' ... gcc/ChangeLog: * config/riscv/riscv-vsetvl.cc (anticipatable_occurrence_p): Fix incorrect anticipate info. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c: Adapt test. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-26.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-36.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c: Ditto. * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c: Ditto. --- gcc/config/riscv/riscv-vsetvl.cc | 4 ++- .../gather-scatter/strided_load_run-1.c | 1 + .../riscv/rvv/vsetvl/vlmax_back_prop-24.c | 2 +- .../riscv/rvv/vsetvl/vlmax_back_prop-25.c | 31 +-- .../riscv/rvv/vsetvl/vlmax_back_prop-26.c | 30 +- .../riscv/rvv/vsetvl/vlmax_back_prop-36.c | 2 +- .../riscv/rvv/vsetvl/vlmax_switch_vtype-14.c | 10 +++--- .../riscv/rvv/vsetvl/vlmax_switch_vtype-15.c | 14 - 8 files changed, 47 insertions(+), 47 deletions(-) diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc index 628bf116db0..08c487d82c0 100644 --- a/gcc/config/riscv/riscv-vsetvl.cc +++ b/gcc/config/riscv/riscv-vsetvl.cc @@ -333,7 +333,9 @@ anticipatable_occurrence_p (const bb_info *bb, const vector_insn_info dem) if (dem.has_avl_reg ()) { /* rs1 (avl) are not modified in the basic block prior to the VSETVL. */ - if (!vlmax_avl_p (dem.get_avl ())) + rtx avl + = has_vl_op (insn->rtl ()) ? get_vl (insn->rtl ()) : dem.get_avl (); + if (!vlmax_avl_p (avl)) { set_info *set = dem.get_avl_source (); /* If it's undefined, it's not anticipatable conservatively. */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c index 4b03c25a907..7ffa93bf13f 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/strided_load_run-1.c @@ -1,4 +1,5 @@ /* { dg-do run { target { riscv_vector } } } */ +/* { dg-additional-options "-mcmodel=medany" } */ #include "strided_load-1.c" #include diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c index bc98e5f8269..fe41d15cb28 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-24.c @@ -30,7 +30,7 @@ void f (int32_t * restrict in, int32_t * restrict out, int n, int cond) *(vint32mf2_t*)(out + 7000) = v; for (int i = 0; i < n; i++) { -vbool64_t v; +vbool64_t v = *(vbool64_t*)(in + i + 9000); *(vbool64_t*)(out + i + 700) = v; } } diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c index 0a10827daf5..c566f8a4751 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c +++