https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104372
Bug ID: 104372 Summary: [ARM] Unnecessary writes to stack when passing aggregate in registers Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: palchak at google dot com Target Milestone: --- Missed optimization when an aggregate is passed by value entirely in registers: struct Bar {}; struct Foo { Bar *addr; int size; }; Bar* MakeBar1(Bar *addr, int) noexcept { return addr; } Bar* MakeBar2(Foo foo) noexcept { return foo.addr; } When compiled with '-O2' using 'arm-unknown-linux-gnueabihf-g++ (GCC) 12.0.0' generates: MakeBar1(Bar*, int): bx lr MakeBar2(Foo): sub sp, sp, #8 add r3, sp, #8 stmdb r3, {r0, r1} add sp, sp, #8 bx lr The creation of a stack frame in MakeBar2 is completely unnecessary. For comparison, Clang 11.0.1 generates identical code for both functions that matches MakeBar1 shown here.