https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125856
H.J. Lu <hjl.tools at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2026-06-17
Ever confirmed|0 |1
--- Comment #1 from H.J. Lu <hjl.tools at gmail dot com> ---
__builtin_memmove is expanded like this:
[hjl@gnu-zen4-1 pr125856]$ cat y.c
void
bounded_copy (char *dst, const char *src, __SIZE_TYPE__ n)
{
if (n <= 15)
__builtin_memmove(dst, src, n);
}
[hjl@gnu-zen4-1 pr125856]$ make y.s
/export/build/gnu/tools-build/gcc-gitlab-debug/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/tools-build/gcc-gitlab-debug/build-x86_64-linux/gcc/ -O2 -S
y.c
[hjl@gnu-zen4-1 pr125856]$ cat y.s
.file "y.c"
.text
.p2align 4
.globl bounded_copy
.type bounded_copy, @function
bounded_copy:
.LFB0:
.cfi_startproc
cmpq $15, %rdx
jbe .L9
.L1:
ret
.p2align 4,,10
.p2align 3
.L9:
cmpl $8, %edx
jnb .L10
cmpl $4, %edx
jnb .L5
cmpl $1, %edx
ja .L6
jb .L1
movzbl (%rsi), %eax
movb %al, (%rdi)
ret
.p2align 4,,10
.p2align 3
.L10:
movl %edx, %edx
movq (%rsi), %rcx
movq -8(%rsi,%rdx), %rax
movq %rcx, (%rdi)
movq %rax, -8(%rdi,%rdx)
ret
.p2align 4,,10
.p2align 3
.L5:
movl %edx, %edx
movl (%rsi), %ecx
movl -4(%rsi,%rdx), %eax
movl %ecx, (%rdi)
movl %eax, -4(%rdi,%rdx)
ret
.p2align 4,,10
.p2align 3
.L6:
movl %edx, %edx
movzwl (%rsi), %ecx
movzwl -2(%rsi,%rdx), %eax
movw %cx, (%rdi)
movw %ax, -2(%rdi,%rdx)
ret
.cfi_endproc
.LFE0:
.size bounded_copy, .-bounded_copy
.ident "GCC: (GNU) 17.0.0 20260617 (experimental)"
.section .note.GNU-stack,"",@progbits
[hjl@gnu-zen4-1 pr125856]$
If it looks OK, we can expand the bounded memcpy like memmove.