On 10 October 2014 21:13, Jeff Law <l...@redhat.com> wrote: ... > ISTM it would be better to find the mode of the same class that corresponds > to GET_MODE_SIZE (mode) / nregs. In your case that's obviously QImode :-)
Like this? Or did you mean to remove the save_mode[regno] use altogether? I can think of arguments for or against, but got no concrete examples for either.
2014-10-11 Joern Rennecke <joern.renne...@embecosm.com> Jeff Law <l...@redhat.com> * caller-save.c (replace_reg_with_saved_mem): If saved_mode covers multiple hard registers, use word_mode. diff --git a/gcc/caller-save.c b/gcc/caller-save.c index e28facb..31b1a36 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -1158,9 +1158,12 @@ replace_reg_with_saved_mem (rtx *loc, } else { - gcc_assert (save_mode[regno] != VOIDmode); - XVECEXP (mem, 0, i) = gen_rtx_REG (save_mode [regno], - regno + i); + enum machine_mode smode = save_mode[regno]; + gcc_assert (smode != VOIDmode); + if (hard_regno_nregs [regno][smode] > 1) + smode = mode_for_size (GET_MODE_SIZE (mode) / nregs, + GET_MODE_CLASS (mode), 0); + XVECEXP (mem, 0, i) = gen_rtx_REG (smode, regno + i); } }