aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2004-01-14 16:25:09 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2004-01-14 16:25:09 +0000
commit684bcee5367498b836f33acc8acee494dadaf115 (patch)
treecfe0e511c5773b158e11452df022ec23938aee59 /gcc
parente7844ffbe7f9312fd83d1f5f62b5d22fde785c6c (diff)
downloadgcc-684bcee5367498b836f33acc8acee494dadaf115.zip
gcc-684bcee5367498b836f33acc8acee494dadaf115.tar.gz
gcc-684bcee5367498b836f33acc8acee494dadaf115.tar.bz2
regrename.c (find_oldest_value_reg): If the replacement uses multiple hard registers...
* regrename.c (find_oldest_value_reg): If the replacement uses multiple hard registers, check that all of them are in CLASS. From-SVN: r75867
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/regrename.c22
2 files changed, 18 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 060d3f8..63bebc5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-01-14 Richard Earnshaw <rearnsha@arm.com>
+
+ * regrename.c (find_oldest_value_reg): If the replacement uses
+ multiple hard registers, check that all of them are in CLASS.
+
2004-01-14 Jan Hubicka <jh@suse.cz>
* alias.c (get_alias_set): Initialize alias set to 0 when subset is
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 56f6a88..871507b 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1,5 +1,5 @@
/* Register renaming for the GNU compiler.
- Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of GCC.
@@ -1339,15 +1339,19 @@ find_oldest_value_reg (enum reg_class class, rtx reg, struct value_data *vd)
{
enum machine_mode oldmode = vd->e[i].mode;
rtx new;
+ unsigned int last;
- if (TEST_HARD_REG_BIT (reg_class_contents[class], i)
- && (new = maybe_mode_change (oldmode, vd->e[regno].mode, mode, i,
- regno)))
- {
- ORIGINAL_REGNO (new) = ORIGINAL_REGNO (reg);
- REG_ATTRS (new) = REG_ATTRS (reg);
- return new;
- }
+ for (last = i; last < i + HARD_REGNO_NREGS (i, mode); last++)
+ if (!TEST_HARD_REG_BIT (reg_class_contents[class], last))
+ return NULL_RTX;
+
+ if (new = maybe_mode_change (oldmode, vd->e[regno].mode, mode, i,
+ regno))
+ {
+ ORIGINAL_REGNO (new) = ORIGINAL_REGNO (reg);
+ REG_ATTRS (new) = REG_ATTRS (reg);
+ return new;
+ }
}
return NULL_RTX;