From 69a350853900f6b6f9775deb95efff942020a55f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 11 Jan 2018 09:54:26 +0000 Subject: [PATCH] Fix mode_for_size units in caller-save.c (PR83761) The new opt_mode asserts triggered for replace_reg_with_saved_mem because it was passing bytes rather than bits to mode_for_size. Previously we ended up with a BLKmode register instead, but presumably that didn't matter because this is "only" used for debug insns. 2018-01-11 Richard Sandiford gcc/ PR rtl-optimization/83761 * caller-save.c (replace_reg_with_saved_mem): Pass bits rather than bytes to mode_for_size. From-SVN: r256525 --- gcc/ChangeLog | 6 ++++++ gcc/caller-save.c | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32652720c89..9e5f46a259d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-01-11 Richard Sandiford + + PR rtl-optimization/83761 + * caller-save.c (replace_reg_with_saved_mem): Pass bits rather + than bytes to mode_for_size. + 2018-01-10 Jan Hubicka PR middle-end/83189 diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 524de495b51..df1c9691e0c 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -1147,7 +1147,8 @@ replace_reg_with_saved_mem (rtx *loc, machine_mode smode = save_mode[regno]; gcc_assert (smode != VOIDmode); if (hard_regno_nregs (regno, smode) > 1) - smode = mode_for_size (exact_div (GET_MODE_SIZE (mode), nregs), + smode = mode_for_size (exact_div (GET_MODE_BITSIZE (mode), + nregs), GET_MODE_CLASS (mode), 0).require (); XVECEXP (mem, 0, i) = gen_rtx_REG (smode, regno + i); } -- 2.30.2