https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112713
Bug ID: 112713 Summary: RISC-V: Trunk GCC regression on VSETVL PASS comparing with GCC-13 Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: juzhe.zhong at rivai dot ai Target Milestone: --- https://godbolt.org/z/qePhcxd5z #include "riscv_vector.h" size_t foo (char const *buf, size_t len) { size_t sum = 0; size_t vl = __riscv_vsetvlmax_e8m8(); size_t step = vl * 4; const char *it = buf, *end = buf + len; for(; it + step <= end; ) { it += vl; vint8m8_t v3 = __riscv_vle8_v_i8m8((void*)it, vl); it += vl; vbool1_t m3 = __riscv_vmsgt_vx_i8m8_b1(v3, -65, vl); sum += __riscv_vcpop_m_b1(m3, vl); } return sum; } GCC-14 ASM: foo: vsetvli a4,zero,e8,m8,ta,ma slli a5,a4,2 add a1,a0,a1 add a5,a0,a5 bltu a1,a5,.L4 slli a6,a4,1 add a5,a0,a4 add t1,a6,a4 li a0,0 li a7,-65 vsetvli zero,zero,e8,m8,ta,ma ----------> redundant .L3: vle8.v v8,0(a5) add a5,a5,a6 add a3,t1,a5 vmsgt.vx v8,v8,a7 vcpop.m a2,v8 add a0,a0,a2 bgeu a1,a3,.L3 ret .L4: li a0,0 ret GCC-13 ASM: foo: vsetvli a4,zero,e8,m8,ta,ma slli a5,a4,2 add a1,a0,a1 add a5,a0,a5 bltu a1,a5,.L4 slli a6,a4,1 add a5,a0,a4 add t1,a6,a4 li a0,0 li a7,-65 .L3: vle8.v v8,0(a5) add a5,a5,a6 add a3,t1,a5 vmsgt.vx v24,v8,a7 vcpop.m a2,v24 add a0,a0,a2 bgeu a1,a3,.L3 ret .L4: li a0,0 ret Trunk GCC-14 has a regression that cause a redundant vsetvl. Such regression need to be fixed and I will take a look at it.