https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121681

            Bug ID: 121681
           Summary: -mno-scalar-strict-align doesn't work on rv64 (memcpy
                    is not optimized like on x86_64 and aarch64)
           Product: gcc
           Version: 15.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sergey at lobanov dot in
  Target Milestone: ---

source code:
#include <string.h>
int main(int argc, char **argv) {
    int x;
    memcpy(&x, argv[0] + argc, sizeof(int));
    return x;
}

build command line:
riscv64-alpine-linux-musl-gcc-15.2.0 -O3 -mno-scalar-strict-align
-U_FORTIFY_SOURCE -fno-stack-protector 2.c

asm code:
00000000000005e0 <main>:
 5e0:   619c                    ld      a5,0(a1)
 5e2:   1141                    addi    sp,sp,-16
 5e4:   953e                    add     a0,a0,a5
 5e6:   00054603                lbu     a2,0(a0)
 5ea:   00154683                lbu     a3,1(a0)
 5ee:   00254703                lbu     a4,2(a0)
 5f2:   00354783                lbu     a5,3(a0)
 5f6:   00c10623                sb      a2,12(sp)
 5fa:   00d106a3                sb      a3,13(sp)
 5fe:   00e10723                sb      a4,14(sp)
 602:   00f107a3                sb      a5,15(sp)
 606:   4532                    lw      a0,12(sp)
 608:   0141                    addi    sp,sp,16
 60a:   8082                    ret

expected result (this result was obtained using "clang -O3 -mno-strict-align
-fno-stack-protector -U_FORTIFY_SOURCE 2.c"):
00000000000006dc <main>:
 6dc:   618c                    ld      a1,0(a1)
 6de:   952e                    add     a0,a0,a1
 6e0:   4108                    lw      a0,0(a0)
 6e2:   8082                    ret

clang (20.1.8) optimizes memcpy as unaligned access. gcc doesn't do it

on linux x86_64 and linux aarch64 gcc optimizes provided example as unaligned
access, but on riscv64 I can't force GCC to use unaligned access

# riscv64-alpine-linux-musl-gcc-15.2.0 -v
Using built-in specs.
COLLECT_GCC=riscv64-alpine-linux-musl-gcc-15.2.0
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/riscv64-alpine-linux-musl/15.2.0/lto-wrapper
Target: riscv64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-15.2.0/configure
--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--build=riscv64-alpine-linux-musl --host=riscv64-alpine-linux-musl
--target=riscv64-alpine-linux-musl --enable-checking=release --disable-cet
--disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls
--disable-werror --disable-symvers --enable-__cxa_atexit --enable-default-pie
--enable-default-ssp --enable-languages=c,c++,objc,go,fortran,ada
--enable-link-serialization=2 --enable-linker-build-id --with-arch=rv64gc
--with-abi=lp64d --enable-autolink-libatomic --disable-libquadmath
--disable-libssp --disable-libsanitizer --enable-shared --enable-threads
--enable-tls --disable-libitm
--with-bugurl=https://gitlab.alpinelinux.org/alpine/aports/-/issues
--with-system-zlib --with-linker-hash-style=gnu --with-pkgversion='Alpine
15.2.0'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 15.2.0 (Alpine 15.2.0)

Reply via email to