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.