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

            Bug ID: 82014
           Summary: worse code emitted for a valid memove than for
                    undefined memcpy
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

GCC folds overlapping (and thus strictly undefined) calls to memcpy to
efficient series of assignments with the same semantics as memmove but it fails
to do the same fow the well-defined calls to memmove.  This could encourage
users who notice to rely on undefined code.

$ cat a.c && gcc -O2 -S -Wall -Wextra -Wpedantic -o/dev/stdout a.c
char a[8] = "12345678";

void f (void)
{
  __builtin_memcpy (a, a + 3, sizeof a - 3);   // strictly undefined
}

void g (void)
{
  __builtin_memmove (a, a + 3, sizeof a - 3);   // well-defined
}

        .file   "a.c"
        .text
        .p2align 4,,15
        .globl  f
        .type   f, @function
f:
.LFB0:
        .cfi_startproc
        movl    a+3(%rip), %eax
        movl    %eax, a(%rip)
        movzbl  a+7(%rip), %eax
        movb    %al, a+4(%rip)
        ret
        .cfi_endproc
.LFE0:
        .size   f, .-f
        .p2align 4,,15
        .globl  g
        .type   g, @function
g:
.LFB1:
        .cfi_startproc
        movl    $5, %edx
        movl    $a+3, %esi
        movl    $a, %edi
        jmp     memmove
        .cfi_endproc
.LFE1:
        .size   g, .-g
        .globl  a
        .data
        .align 8
        .type   a, @object
        .size   a, 8
a:
        .ascii  "12345678"
        .ident  "GCC: (GNU) 8.0.0 20170824 (experimental)"
        .section        .note.GNU-stack,"",@progbits

Reply via email to