Fix mode_for_size units in caller-save.c (PR83761)
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 11 Jan 2018 09:54:26 +0000 (09:54 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 11 Jan 2018 09:54:26 +0000 (09:54 +0000)
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  <richard.sandiford@linaro.org>

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
gcc/caller-save.c

index 32652720c897790db8b9fe60c252dadba7235c11..9e5f46a259d876473f631485874bcf06f00bddb8 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-11  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       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  <hubicka@ucw.cz>
 
        PR middle-end/83189
index 524de495b51759d3efe6694893a99c706516015d..df1c9691e0c2749f45df8b259a70de80fc85b817 100644 (file)
@@ -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);
          }