diff options
author | Richard Henderson <rth@gcc.gnu.org> | 2002-01-07 22:13:34 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-01-07 22:13:34 -0800 |
commit | 57d1019b988976e66d1159f7c52384760ade227e (patch) | |
tree | 8be94b41904aef428279cea50f3a0662e922a449 /gcc/regrename.c | |
parent | 70ec0b9b9faad0d709cd44be3247127caef73c12 (diff) | |
download | gcc-57d1019b988976e66d1159f7c52384760ade227e.tar.gz |
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
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r-- | gcc/regrename.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/gcc/regrename.c b/gcc/regrename.c index 720e0cf46c9..45f5b8552ef 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -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; |