https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125968
Bug ID: 125968
Summary: Unnecessary load and store for inlined memove
Product: gcc
Version: 16.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: hjl.tools at gmail dot com
Target Milestone: ---
Target: x86-64
[hjl@gnu-tgl-3 tmp]$ cat foo.c
char *
foo (char *dest, char *src, __SIZE_TYPE__ len)
{
if (len <= 1)
return __builtin_memmove (dest, src, len);
else
return dest;
}
[hjl@gnu-tgl-3 tmp]$ /usr/gcc-16.1.1-x32/bin/gcc -S -O2 foo.c
[hjl@gnu-tgl-3 tmp]$ cat foo.s
.file "foo.c"
.text
.p2align 4
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
movq %rdi, %rax
cmpq $1, %rdx
jbe .L7
.L2:
ret
.p2align 4,,10
.p2align 3
.L7:
cmpl $1, %edx
jb .L2
movl %edx, %edx
movzbl (%rsi), %edi
movzbl -1(%rsi,%rdx), %ecx <<< Unnecessary.
movb %dil, (%rax)
movb %cl, -1(%rax,%rdx) <<< Unnecessary.
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (GNU) 16.1.1 20260516"
.section .note.GNU-stack,"",@progbits
[hjl@gnu-tgl-3 tmp]$