aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2005-03-19 15:01:45 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2005-03-19 15:01:45 +0000
commit1ad93fbfe98afdcb5be95b81afd6e788c22975d2 (patch)
treec62efb2d340e59138526b2a6831e432d2357fb61
parent91a5bc9f9a8faf903c54b22a6e43e8450dd9a50f (diff)
downloadgcc-1ad93fbfe98afdcb5be95b81afd6e788c22975d2.zip
gcc-1ad93fbfe98afdcb5be95b81afd6e788c22975d2.tar.gz
gcc-1ad93fbfe98afdcb5be95b81afd6e788c22975d2.tar.bz2
combine.c (try_combine): When changing the mode of a hard reg, make sure that doing so is valid.
* combine.c (try_combine): When changing the mode of a hard reg, make sure that doing so is valid. From-SVN: r96730
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/combine.c12
2 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c6f64c1..c55ed73 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-19 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * combine.c (try_combine): When changing the mode of a hard reg, make
+ sure that doing so is valid.
+
2005-03-19 Richard Sandiford <rsandifo@redhat.com>
* config/avr/avr.c (avr_init_stack, avr_mcu_name): Make static.
diff --git a/gcc/combine.c b/gcc/combine.c
index d6ec6ac..87a2f8d 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -2373,11 +2373,17 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
&& REG_P (i2dest)
#endif
/* We need I2DEST in the proper mode. If it is a hard register
- or the only use of a pseudo, we can change its mode. */
+ or the only use of a pseudo, we can change its mode.
+ Make sure we don't change a hard register to have a mode that
+ isn't valid for it, or change the number of registers. */
&& (GET_MODE (*split) == GET_MODE (i2dest)
|| GET_MODE (*split) == VOIDmode
- || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
- || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
+ || (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
+ && HARD_REGNO_MODE_OK (REGNO (i2dest), GET_MODE (*split))
+ && (HARD_REGNO_NREGS (REGNO (i2dest), GET_MODE (i2dest))
+ == HARD_REGNO_NREGS (REGNO (i2dest), GET_MODE (*split))))
+ || (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER
+ && REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
&& ! REG_USERVAR_P (i2dest)))
&& (next_real_insn (i2) == i3
|| ! use_crosses_set_p (*split, INSN_CUID (i2)))