Skip to content

[Clang] optimization: clang does not know memcpy returns its first arg #139240

Open
@rockeet

Description

@rockeet

Both compile with -O3

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

gcc generate code:

foo(char*, char const*, unsigned long):
        push    rbx
        mov     rbx, rdx
        call    memcpy
        mov     QWORD PTR [rax+rbx], rbx
        pop     rbx
        ret

gcc knows memcpy returns its first arg.

clang generate code:

foo(char*, char const*, unsigned long):
        push    r14
        push    rbx
        push    rax
        mov     rbx, rdx
        mov     r14, rdi
        call    memcpy@PLT
        mov     qword ptr [r14 + rbx], rbx
        add     rsp, 8
        pop     rbx
        pop     r14
        ret

clang does not know memcpy returns its first arg. It is worse that even when we tell clang to use return value from memcpy:

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

clang still generate same code as original foo. gcc also generate same code for foo and foo2.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions