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.