[llvm-bugs] [Bug 46405] New: Calling a function with the address of your own argument produces lots of unnecessary moves

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Jun 19 11:59:13 PDT 2020


https://bugs.llvm.org/show_bug.cgi?id=46405

            Bug ID: 46405
           Summary: Calling a function with the address of your own
                    argument produces lots of unnecessary moves
           Product: new-bugs
           Version: 10.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: josephcsible at gmail.com
                CC: htmldeveloper at gmail.com, llvm-bugs at lists.llvm.org

Consider this code:

void g(long *);
long f(long x) {
    g(&x);
    return x;
}

With "-O3", it results in this assembly:

f:
        pushq   %rax
        movq    %rdi, (%rsp)
        movq    %rsp, %rdi
        callq   g
        movq    (%rsp), %rax
        popq    %rcx
        retq

This does two unnecessary moves, because it wastes both the push and pop to
just update the stack pointer, and then immediately fills in the right value
afterwards.

With "-Os", it results in this assembly:

f:
        pushq   %rbx
        subq    $16, %rsp
        leaq    8(%rsp), %rbx
        movq    %rdi, (%rbx)
        movq    %rbx, %rdi
        callq   g
        movq    (%rbx), %rax
        addq    $16, %rsp
        popq    %rbx
        retq

This is a really big mess and is hardly any shorter than "-O0" (in fact, it'd
be longer if not for the frame pointer).

In both cases, it should produce something more like this instead:

f:
        pushq   %rdi
        movq    %rsp, %rdi
        callq   g
        popq    %rax
        retq

Godbolt link: https://godbolt.org/z/aoSMqg

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200619/30b721d4/attachment.html>


More information about the llvm-bugs mailing list