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

            Bug ID: 120841
           Summary: gcc prefer non-volatile register produces sub optimal
                    code
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rockeet at gmail dot com
  Target Milestone: ---

void foo(char* buf, const char* src, size_t n) {
    memcpy(buf, src, n);
    memcpy(buf + n, &n, sizeof(n));
}

Both gcc and g++ produces(https://godbolt.org/z/TzW4jvToe):

        push    rbx
        mov     rbx, rdx
        call    memcpy
        mov     QWORD PTR [rax+rbx], rbx
        pop     rbx
        ret

The optimal does not need non-volatile register:

        push    rdx
        call    memcpy
        pop     rdx
        mov     QWORD PTR [rax+rdx], rdx
        ret

Reply via email to