https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67283
Bug ID: 67283 Summary: GCC regression over inlining of returned structures Product: gcc Version: 5.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: roche at httrack dot com Target Milestone: --- Created attachment 36219 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36219&action=edit Sample test case (gcc -S -O3 -W -Wall) An optimization bug regression appears to exist when dealing with structures returned by inlined functions. This was working totally fine with GCC 4.4.7. (see below) A typical example is: struct foo { int flags; /* Let it be enough NOT to be packed in registers */ void *opaque[2]; }; static __inline__ struct foo add_flag(struct foo foo, int flag) { foo.flags |= flag; return foo; } Calls to "add_flag" are inlined, but the stack usage increases with latest GCC versions (the code should be almost identical, except the flag in place in the stack). Tested the following GCC versions: (grep "addq.*%rsp" to get stack usage for each function) ; tested architecture: x86-64 GCC 4.4.7: OK addq $72, %rsp # demo_1 addq $72, %rsp addq $72, %rsp addq $72, %rsp addq $72, %rsp # demo_5 GCC 4.5.3 to 4.6.4: NOK (UNTESTED between 4.4.8 to 4.5.2) addq $72, %rsp # demo_1 addq $136, %rsp addq $168, %rsp addq $200, %rsp addq $232, %rsp # demo_5 GCC 4.7.3 to 5.2.0: NOK (UNTESTED between 4.6.5 to 4.7.2) addq $72, %rsp # demo_1 addq $136, %rsp addq $200, %rsp addq $264, %rsp addq $328, %rsp # demo_5 Therefore, the test case was fine in GCC 4.4.7, first degraded between 4.4.8 and 4.5.3, and then again between 4.6.5 and 4.7.3 Note: code produced with http://gcc.godbolt.org/ with -O3 -W -Wall flags. (same results with -01)