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)