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]$

Reply via email to