-002-01-07 Aldy Hernandez <aldyh@redhat.com>
+2002-01-07 Richard Henderson <rth@redhat.com>
+
+ * regrename.c (find_oldest_value_reg): Ignore the value chain if
+ the original register was copied in a mode with a fewer number of
+ hard registers than the desired mode.
+ (copyprop_hardreg_forward_1): Likewise.
+ (debug_value_data): Fix loop test.
+ * toplev.c (parse_options_and_default_flags): Reenable
+ -fcprop-registers at -O1.
+
+2002-01-07 Aldy Hernandez <aldyh@redhat.com>
* config/rs6000/rs6000.c (bdesc_2arg): Add altivec predicates.
(altivec_init_builtins): New node v4si_ftype_v16qi_v16qi.
enum machine_mode mode = GET_MODE (reg);
unsigned int i;
+ /* If we are accessing REG in some mode other that what we set it in,
+ make sure that the replacement is valid. In particular, consider
+ (set (reg:DI r11) (...))
+ (set (reg:SI r9) (reg:SI r11))
+ (set (reg:SI r10) (...))
+ (set (...) (reg:DI r9))
+ Replacing r9 with r11 is invalid. */
+ if (mode != vd->e[regno].mode)
+ {
+ if (HARD_REGNO_NREGS (regno, mode)
+ > HARD_REGNO_NREGS (regno, vd->e[regno].mode))
+ return NULL_RTX;
+ }
+
for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)
if (TEST_HARD_REG_BIT (reg_class_contents[class], i)
&& (vd->e[i].mode == mode
unsigned int i;
rtx new;
+ /* If we are accessing SRC in some mode other that what we
+ set it in, make sure that the replacement is valid. */
+ if (mode != vd->e[regno].mode)
+ {
+ if (HARD_REGNO_NREGS (regno, mode)
+ > HARD_REGNO_NREGS (regno, vd->e[regno].mode))
+ goto no_move_special_case;
+ }
+
/* If the destination is also a register, try to find a source
register in the same class. */
if (REG_P (SET_DEST (set)))
}
}
}
+ no_move_special_case:
/* For each input operand, replace a hard register with the
eldest live copy that's in an appropriate register class. */
j != INVALID_REGNUM;
j = vd->e[j].next_regno)
{
- if (TEST_HARD_REG_BIT (set, vd->e[j].next_regno))
+ if (TEST_HARD_REG_BIT (set, j))
{
fprintf (stderr, "[%u] Loop in regno chain\n", j);
return;