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();
}

Reply via email to