https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92223
Bug ID: 92223 Summary: Redundant pushing to stack when passing empty structs to function (x32) Product: gcc Version: 9.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lahav.sch.gcc at gmail dot com Target Milestone: --- Hi! I tested the following code in several version of GCC, including trunk. In the following code: struct Empty {}; void foo(int, Empty, int); int main() { foo(10, Empty{}, 15); } The call to foo compiles to: pushl $0xf pushl $0x0 pushl $0xa call foo(int, Empty, int) A similar issue was fixed in the GCC 8.1 release, but only for x86-64 - In x64 the Empty parameter is now completely removed (Instead of passing an dummy 0 value on the stack), but in x32 it still remains. I'm not sure if the x32 ABI mandates that such empty classes should be completely removed (In contrast with the System V x86-64 ABI which states they indeed should not be passed). In pre-GCC 8 version on x86-64 a similar behaviour happend - 0xa was into $edi, the 0xf was passed to $esi, but there was a "pushq $0x0" to the stack. Perhaps the two behaviour are related?