https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101326
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- I think the issue is simply that RTL expansion forces the object to memory since that is what GIMPLE does: struct optional foo () { struct optional D.12374; <bb 2> [local count: 1073741824]: MEM <long int> [(struct optional *)&D.12374] = 0; MEM <unsigned char> [(struct optional *)&D.12374 + 8B] = 1; return D.12374; } and yes, if it would have had TImode we could expand it to a register pair but it has BLKmode because it's TYPE_NEEDS_CONSTRUCTING(?), the type isn't TREE_ADDRESSABLE for me.