https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123780
Bug ID: 123780
Summary: gcc miscompiles rvv intrinsics at -O0/1/2/3
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: rvismith1115 at gmail dot com
Target Milestone: ---
gcc miscompiles rvv intrinsics at -O0/1/2/3:
> riscv64-unknown-elf-g++ --version
riscv64-unknown-elf-g++ () 16.0.1 20260118 (experimental)
> riscv64-unknown-linux-gnu-g++ bug.cpp -O0 -march=rv64gcv_zvfh -mabi=lp64d &&
> $QEMU a.out
Segmentation fault (core dumped)
> riscv64-unknown-linux-gnu-g++ bug.cpp -O1 -march=rv64gcv_zvfh -mabi=lp64d &&
> $QEMU a.out
-1.000000
0.000000
0.000000
> clang++ bug.cpp -O0 -march=rv64gcv_zvfh -mabi=lp64d && $QEMU a.out (correct)
-1.000000
-1.000000
-1.000000
Reproducer:
#include <riscv_vector.h>
double k[30], l[30];
void checksum() {
for (int i = 0; i < 30; ++i) __builtin_printf("%lf\n", l[i]);
}
int main() {
for (int i = 0; i < 30; ++i) { k[i] = 1; }
for (size_t m = 0, avl = 30; avl > 0;) {
size_t s = __riscv_vsetvl_e8mf8(avl);
vfloat64m1_t q = __riscv_vle64_v_f64m1(&k[m], s);
q = __riscv_vfneg_v_f64m1(q, s);
vuint8mf8_t r = __riscv_vsll_vx_u8mf8(__riscv_vid_v_u8mf8(s), 3, s);
__riscv_vsoxei8(&l[m], r, q, s);
avl -= s; m += s;
}
checksum();
}