https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120450
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- The question is what's the reason we end up here from expand_constructor. There's /* Handle calls that pass values in multiple non-contiguous locations. The Irix 6 ABI has examples of this. */ if (target == 0 || ! safe_from_p (target, exp, 1) || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM /* Also make a temporary if the store is to volatile memory, to avoid individual accesses to aggregate members. */ || (GET_CODE (target) == MEM && MEM_VOLATILE_P (target) && !TREE_ADDRESSABLE (TREE_TYPE (exp)))) { if (avoid_temp_mem) return NULL_RTX; target = assign_temp (type, TREE_ADDRESSABLE (exp), 1); I guess the && !TREE_ADDRESSABLE (TREE_TYPE (exp)) should be applied globally, but then other cases might break(?) So how does 'target' look like, is !safe_from_p true?