From: Bernd Schmidt Date: Sat, 19 Mar 2005 15:01:45 +0000 (+0000) Subject: combine.c (try_combine): When changing the mode of a hard reg, make sure that doing... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1ad93fbfe98afdcb5be95b81afd6e788c22975d2;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c6f64c141f4..c55ed73260e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-03-19 Bernd Schmidt + + * combine.c (try_combine): When changing the mode of a hard reg, make + sure that doing so is valid. + 2005-03-19 Richard Sandiford * config/avr/avr.c (avr_init_stack, avr_mcu_name): Make static. diff --git a/gcc/combine.c b/gcc/combine.c index d6ec6ac69c3..87a2f8dc1cf 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)))