https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110943
Bug ID: 110943 Summary: RISC-V: vmv.v.x and vmv.s.x pattern combine error Product: gcc Version: 13.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: lehua.ding at rivai dot ai Target Milestone: --- Consider this code (https://godbolt.org/z/TKoqjxTPh): ```c #include <riscv_vector.h> void foo9 (void *base, void *out, size_t vl) { int64_t scalar = *(int64_t*)(base + 100); vint64m2_t v = __riscv_vmv_v_x_i64m2 (0, 1); *(vint64m2_t*)out = v; } ``` the asm of GCC: ```asm foo9: vsetvli a5,zero,e64,m2,ta,ma vmv.v.i v2,0 vsetivli zero,1,e64,m2,ta,ma vse64.v v2,0(a1) ret ``` the asm of LLVM: ```asm foo9: # @foo9 vsetivli zero, 1, e64, m2, ta, ma vmv.v.i v8, 0 vs2r.v v8, (a1) ret ``` I think the GCC changes the semantics of full store `*(vint64m2_t*)out = v;`.If there is a memory exception when storing the second element of v, then LLVM's code will cause but GCC's code doesn't. Confirmed on GCC 13.2.0 and Trunk.