https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109547
Bug ID: 109547
Summary: RISC-V: Multiple vsetvli for load/store loop
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: palmer at gcc dot gnu.org
Target Milestone: ---
I was just poking around with a simple loop using the vector intrinsics and
found some odd generated code. This is on the gcc-13 branch, but that's pretty
close to trunk so I'm filing it for 14. I'm probably not going to have time to
look for a bit, as it seems to just be a performance issue.
$ cat test.c
#include <riscv_vector.h>
void func(unsigned char *out, unsigned char *in, unsigned long len) {
unsigned long i = 0;
while (i < len) {
unsigned long vl = __riscv_vsetvl_e8m1(len - i);
vuint8m1_t r = __riscv_vle8_v_u8m1(in + i, vl);
__riscv_vse8_v_u8m1(out + i, r, vl);
i += vl;
}
}
$ ../toolchain/install/bin/riscv64-unknown-linux-gnu-gcc test.c -O3 -c -S -o-
-march=rv64gcv -fdump-rtl-all
.file "test.c"
.option nopic
.attribute arch,
"rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0_v1p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 1
.globl func
.type func, @function
func:
.LFB2:
.cfi_startproc
beq a2,zero,.L1
li a5,0
.L3:
sub a4,a2,a5
add a6,a1,a5
add a3,a0,a5
vsetvli a4,a4,e8,m1,ta,mu
vsetvli zero,a4,e8,m1,ta,ma
add a5,a5,a4
vle8.v v24,0(a6)
vse8.v v24,0(a3)
bgtu a2,a5,.L3
.L1:
ret
.cfi_endproc
.LFE2:
.size func, .-func
.ident "GCC: (g85b95ea729c) 13.0.1 20230417 (prerelease)"
.section .note.GNU-stack,"",@progbits