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?

Reply via email to