https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85496
--- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> but we do:
> 6987 /* Handle calls that return values in multiple non-contiguous
> locations.
> 6988 The Irix 6 ABI has examples of this. */
> 6989 if (GET_CODE (temp) == PARALLEL)
> 6990 {
> 6991 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
> 6992 scalar_int_mode temp_mode
> 6993 = smallest_int_mode_for_size (size * BITS_PER_UNIT);
> 6994 rtx temp_target = gen_reg_rtx (temp_mode);
> 6995 emit_group_store (temp_target, temp, TREE_TYPE (exp), size);
> 6996 temp = temp_target;
> 6997 }
>
> and starting from that temp has a wrong mode (DImode) rather than the
> desired one (SCmode). I must say I really don't understanding this change,
> before that temp_mode was GET_MODE (temp) except when it was BLKmode or
> VOIDmode.
As stated in the ChangeLog, the point was to avoid clobbering MODE, but I agree
that it's probably a little too bold.