https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117218
Bug ID: 117218
Summary: Miscompilation: A possible miscompilation triggered by
the `__riscv_vcreate_v_u32m1x2` RVV intrinsic in GCC
14
Product: gcc
Version: 14.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: yibohe at pku dot edu.cn
Target Milestone: ---
Link to the Compiler Explorer: https://godbolt.org/z/4bTcosera
For the following code with rvv intrinsics, there seems to be a miscompilation:
```
#include <riscv_vector.h>
int printf(const char *, ...);
int8_t data_mask[5]; uint32_t data_load_1[5]; uint32_t data_load_2[5];
int32_t data_load_3[5]; float data_load_4[5]; uint32_t data_store_vreg_3[5];
int main(){
int8_t tmp_mask[5] = {0, 1, 0, 1, 1, }; for (int i = 0; i < 5; ++i) {
data_mask[i] = tmp_mask[i]; }
uint32_t tmp_1[5] = {4271425586u, 1923065272u, 385778631u, 2492204083u,
837690518u, }; for (int i = 0; i < 5; ++i) { data_load_1[i] = tmp_1[i]; }
uint32_t tmp_2[5] = {1570315145u, 2764202118u, 700162945u, 911905654u,
1782991139u, }; for (int i = 0; i < 5; ++i) { data_load_2[i] = tmp_2[i]; }
int32_t tmp_3[5] = {517111323, 698334434, 790501285, -527885415, 1557147356,
}; for (int i = 0; i < 5; ++i) { data_load_3[i] = tmp_3[i]; }
int8_t* heap_mask = data_mask; uint32_t* heap_load_1 = data_load_1;
uint32_t* heap_load_2 = data_load_2; uint32_t* heap_store_vreg_3 =
data_store_vreg_3;
int placeholder0 = 5;
for (size_t vl; placeholder0 > 0; placeholder0 -= vl){
vl = __riscv_vsetvl_e32m1(placeholder0);
vint8mf4_t vec_value_0= __riscv_vle8_v_i8mf4(heap_mask, vl);
vbool32_t vmask= __riscv_vmseq_vx_i8mf4_b32(vec_value_0, 1, vl);
vuint32m1_t vreg_memory_1 = __riscv_vlse32_v_u32m1(heap_load_1, 1, vl);
vuint32m1_t vreg_memory_2 = __riscv_vle32_v_u32m1_m(vmask, heap_load_2,
vl);
vuint32m1_t vreg_2 = __riscv_vrsub_vx_u32m1(vreg_memory_1, 4198250387u,
vl);
vuint32m1x2_t vreg_3 = __riscv_vcreate_v_u32m1x2(vreg_2, vreg_memory_2);
__riscv_vsseg2e32_v_u32m1x2(heap_store_vreg_3, vreg_3, vl);
heap_mask += vl; heap_load_1 += vl; heap_load_2 += vl; heap_store_vreg_3 +=
vl;
}
for(int i=0; i<5; ++i) { if(data_mask[i]) printf("%x ",
data_store_vreg_3[i]); else printf("0 ");} printf("\n");
return 0;
}
```
$riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc () 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$qemu-riscv64 --version
qemu-riscv64 version 9.1.0
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
$riscv64-unknown-elf-gcc -march=rv64gcv_zvfh -mabi=lp64d -Wno-psabi -static -O0
1.c -o a.out && qemu-riscv64 a.out
$0 0 0 a4c26086 c84e12fd
$riscv64-unknown-elf-gcc -march=rv64gcv_zvfh -mabi=lp64d -Wno-psabi -static -O3
1.c -o a.out && qemu-riscv64 a.out
$0 fe98c832 0 a4c26086 c84e12fd