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.)