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