aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-11-05 11:02:07 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1995-11-05 11:02:07 -0500
commit85e4d983f32f0001b2419b024fa8660dea2deac5 (patch)
tree868f4d0fb2bfe5cdc177627688e55558e3f2e033 /gcc
parent8cb3db079c44e3deddfade27cc6cd1343aae98cd (diff)
downloadgcc-85e4d983f32f0001b2419b024fa8660dea2deac5.zip
gcc-85e4d983f32f0001b2419b024fa8660dea2deac5.tar.gz
gcc-85e4d983f32f0001b2419b024fa8660dea2deac5.tar.bz2
(invalidate): For a pseudo register, do a loop to invalidate all table
entries, irrespective of mode. From-SVN: r10556
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cse.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index 2c9ee2e..7fa597e 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -1536,7 +1536,15 @@ invalidate (x, full_mode)
reg_tick[regno]++;
if (regno >= FIRST_PSEUDO_REGISTER)
- remove_from_table (lookup_for_remove (x, hash, GET_MODE (x)), hash);
+ {
+ /* Because a register can be referenced in more than one mode,
+ we might have to remove more than one table entry. */
+
+ struct table_elt *elt;
+
+ while (elt = lookup_for_remove (x, hash, GET_MODE (x)))
+ remove_from_table (elt, hash);
+ }
else
{
HOST_WIDE_INT in_table