https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92088
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Created attachment 47041 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47041&action=edit patch for the inliner void foo(int n) { struct X { int a[n]; } y; inline struct X __attribute__((always_inline)) baz (struct X x) { x.a[0] = 1; return x; } y.a[0] = 0; y = baz(y); if (y.a[0] != 1) __builtin_abort (); } doesn't require any other middle-end fixes but straight runs into the inliner deficiency. Note that we don't use DECL_BY_REFERENCE here so the ABI for passing this might be a bit odd (or not properly defined at all - we're dealing with nested functions anyway). Anyhow - attached is a patc^Whack for the inliner. We then inline this as struct X xD.1985 [value-expr: *_52]; ... _52 = __builtin_alloca_with_align (_48, 32); _53 = __builtin_memcpy (_52, y.1_46, _48); but we obviously lack building a stack_save/restore pair around inlinings of alloca-calling functions (or such param setup).