aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPat Haugen <pthaugen@us.ibm.com>2004-08-03 15:00:49 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2004-08-03 11:00:49 -0400
commit8589ae15787afc9ab55d5f6a53582e84896faffe (patch)
tree3164915de82af253641d1ec14bbc4aa52b2fbaf8 /gcc
parent8ee6eb4e8c7bba61f471d259f84cb11f92120eb7 (diff)
downloadgcc-8589ae15787afc9ab55d5f6a53582e84896faffe.zip
gcc-8589ae15787afc9ab55d5f6a53582e84896faffe.tar.gz
gcc-8589ae15787afc9ab55d5f6a53582e84896faffe.tar.bz2
ra-build.c (conflicts_between_webs): For webs that cross a call add conflicts to regs_invalidated_by_call.
2004-08-03 Pat Haugen <pthaugen@us.ibm.com> * ra-build.c (conflicts_between_webs): For webs that cross a call add conflicts to regs_invalidated_by_call. From-SVN: r85482
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ra-build.c16
2 files changed, 15 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68e347e..40fd96b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-03 Pat Haugen <pthaugen@us.ibm.com>
+
+ * ra-build.c (conflicts_between_webs): For webs that cross a call add
+ conflicts to regs_invalidated_by_call.
+
2004-08-03 Paul Brook <paul@codesourcery.com>
* config/arm/arm.c (emit_sfm): Only emit a single frame adjustment.
diff --git a/gcc/ra-build.c b/gcc/ra-build.c
index 650caa1..63fb24e 100644
--- a/gcc/ra-build.c
+++ b/gcc/ra-build.c
@@ -2176,9 +2176,7 @@ static void
conflicts_between_webs (struct df *df)
{
unsigned int i;
-#ifdef STACK_REGS
struct dlist *d;
-#endif
bitmap ignore_defs = BITMAP_XMALLOC ();
unsigned int have_ignored;
unsigned int *pass_cache = xcalloc (num_webs, sizeof (int));
@@ -2253,18 +2251,24 @@ conflicts_between_webs (struct df *df)
free (pass_cache);
BITMAP_XFREE (ignore_defs);
-#ifdef STACK_REGS
- /* Pseudos can't go in stack regs if they are live at the beginning of
- a block that is reached by an abnormal edge. */
for (d = WEBS(INITIAL); d; d = d->next)
{
struct web *web = DLIST_WEB (d);
int j;
+
+ if (web->crosses_call)
+ for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
+ if (TEST_HARD_REG_BIT (regs_invalidated_by_call, j))
+ record_conflict (web, hardreg2web[j]);
+
+#ifdef STACK_REGS
+ /* Pseudos can't go in stack regs if they are live at the beginning of
+ a block that is reached by an abnormal edge. */
if (web->live_over_abnormal)
for (j = FIRST_STACK_REG; j <= LAST_STACK_REG; j++)
record_conflict (web, hardreg2web[j]);
- }
#endif
+ }
}
/* Remember that a web was spilled, and change some characteristics