summaryrefslogtreecommitdiffstats
path: root/gcc/regrename.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2002-01-08 06:13:34 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2002-01-08 06:13:34 +0000
commit6ec4bb608ce14ba52869db32ed423198074125c0 (patch)
tree8be94b41904aef428279cea50f3a0662e922a449 /gcc/regrename.c
parent2da2b957da8722b43b5ffdd1bdff2b653c8d371e (diff)
downloadppe42-gcc-6ec4bb608ce14ba52869db32ed423198074125c0.tar.gz
ppe42-gcc-6ec4bb608ce14ba52869db32ed423198074125c0.zip
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48624 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r--gcc/regrename.c26
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;
OpenPOWER on IntegriCloud