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

            Bug ID: 118947
           Summary: Missed optimization: GCC forgets stack buffer contents
                    across function call
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: blubban at gmail dot com
  Target Milestone: ---

void* aaa();
void* bbb()
{
    void* ret = aaa();
    char buf[32] = {};
    __builtin_memcpy(ret, buf, 32);
    return ret;
}
void* ccc()
{
    char buf[32] = {};
    void* ret = aaa();
    __builtin_memcpy(ret, buf, 32);
    return ret;
}

-O3


Expected: Same for both.

Actual:


bbb():
        sub     rsp, 40
        call    aaa()
        pxor    xmm0, xmm0
        movups  XMMWORD PTR [rax], xmm0
        movups  XMMWORD PTR [rax+16], xmm0
        add     rsp, 40
        ret
ccc():
        sub     rsp, 40
        pxor    xmm0, xmm0
        movaps  XMMWORD PTR [rsp], xmm0
        movaps  XMMWORD PTR [rsp+16], xmm0
        call    aaa()
        movdqa  xmm0, XMMWORD PTR [rsp]
        movups  XMMWORD PTR [rax], xmm0
        movdqa  xmm0, XMMWORD PTR [rsp+16]
        movups  XMMWORD PTR [rax+16], xmm0
        add     rsp, 40
        ret


https://godbolt.org/z/oTrTxEKc1

(Former isn't fully optimized either, it reserves stack space for buf despite
all accesses being optimized out. Looks like a different issue to me, so I
filed bug 118946.)

Reply via email to