regrename.c (find_oldest_value_reg): Ignore the value chain if the original register was copied in a mode with a...
* 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. From-SVN: r48624
This commit is contained in:
parent
70ec0b9b9f
commit
57d1019b98
3 changed files with 37 additions and 3 deletions
|
@ -1,4 +1,14 @@
|
|||
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.
|
||||
|
|
|
@ -1282,6 +1282,20 @@ find_oldest_value_reg (class, reg, vd)
|
|||
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
|
||||
|
@ -1544,6 +1558,15 @@ copyprop_hardreg_forward_1 (bb, vd)
|
|||
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)))
|
||||
|
@ -1578,6 +1601,7 @@ copyprop_hardreg_forward_1 (bb, vd)
|
|||
}
|
||||
}
|
||||
}
|
||||
no_move_special_case:
|
||||
|
||||
/* For each input operand, replace a hard register with the
|
||||
eldest live copy that's in an appropriate register class. */
|
||||
|
@ -1735,7 +1759,7 @@ debug_value_data (vd)
|
|||
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;
|
||||
|
|
|
@ -4663,7 +4663,7 @@ parse_options_and_default_flags (argc, argv)
|
|||
flag_omit_frame_pointer = 1;
|
||||
#endif
|
||||
flag_guess_branch_prob = 1;
|
||||
/* flag_cprop_registers = 1; */
|
||||
flag_cprop_registers = 1;
|
||||
}
|
||||
|
||||
if (optimize >= 2)
|
||||
|
|
Loading…
Add table
Reference in a new issue