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

            Bug ID: 90883
           Summary: Generated code is worse if returned struct is unnamed
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jzwinck at gmail dot com
  Target Milestone: ---

Demo code:

    #include <array>

    class C
    {
        std::array<char, 7> a{};
        int b{};
    };

    C slow()
    {
        return {};
    }

    C fast()
    {
        C c;
        return c;
    }

On x86-64 with -O2 or -O3, fast() generates good assembly:

        xor     eax, eax
        xor     edx, edx

But slow() does this:

        xor     eax, eax
        mov     DWORD PTR [rsp-25], 0
        mov     BYTE PTR [rsp-21], 0
        mov     edx, DWORD PTR [rsp-24]
        mov     DWORD PTR [rsp-32], 0
        mov     WORD PTR [rsp-28], ax
        mov     BYTE PTR [rsp-26], 0
        mov     rax, QWORD PTR [rsp-32]

GCC has had this problem since version 7.  GCC 6 generated poor code for both
functions.  GCC 4 and 5 generated different but not terrible code.  Clang does
a good job in all versions.

StackOverflow discussion:
https://stackoverflow.com/questions/56578196/why-does-gcc-fail-to-optimize-unless-the-return-value-has-a-name/

Reply via email to