aboutsummaryrefslogtreecommitdiff
path: root/gcc/global.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-01-17 23:19:29 +0000
committerRichard Stallman <rms@gnu.org>1992-01-17 23:19:29 +0000
commit34e567536c877b47a1d055aa73420d66d1c4d7ae (patch)
treeb384e599fc3ef596a91e50d7389cf9fa3720fbfa /gcc/global.c
parent6c65299b5eb54054e639c3f2523e30542fe25555 (diff)
downloadgcc-34e567536c877b47a1d055aa73420d66d1c4d7ae.zip
gcc-34e567536c877b47a1d055aa73420d66d1c4d7ae.tar.gz
gcc-34e567536c877b47a1d055aa73420d66d1c4d7ae.tar.bz2
*** empty log message ***
From-SVN: r204
Diffstat (limited to 'gcc/global.c')
-rw-r--r--gcc/global.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/gcc/global.c b/gcc/global.c
index c016d38..25df390 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -1,5 +1,5 @@
/* Allocate registers for pseudo-registers that span basic blocks.
- Copyright (C) 1987-1991 Free Software Foundation, Inc.
+ Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -394,9 +394,17 @@ global_alloc (file)
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
if (reg_allocno[i] < 0 && reg_renumber[i] >= 0)
{
- local_reg_n_refs[reg_renumber[i]] += reg_n_refs[i];
- local_reg_live_length[reg_renumber[i]] += reg_live_length[i];
+ int regno = reg_renumber[i];
+ int endregno = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (i));
+ int j;
+
+ for (j = regno; j < endregno; j++)
+ {
+ local_reg_n_refs[j] += reg_n_refs[i];
+ local_reg_live_length[j] += reg_live_length[i];
+ }
}
+
/* We can't override local-alloc for a reg used not just by local-alloc. */
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if (regs_ever_live[i])
@@ -1016,8 +1024,16 @@ find_reg (allocno, losers, all_regs_p, accept_call_clobbered, retrying)
than it would be used by this one allocno! */
int k;
for (k = 0; k < max_regno; k++)
- if (reg_renumber[k] == i)
- reg_renumber[k] = -1;
+ if (reg_renumber[k] >= 0)
+ {
+ int regno = reg_renumber[k];
+ int endregno
+ = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (k));
+
+ if (i >= regno && i < endregno)
+ reg_renumber[k] = -1;
+ }
+
best_reg = i;
break;
}