diff options
author | Pat Haugen <pthaugen@us.ibm.com> | 2004-08-03 15:00:49 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2004-08-03 11:00:49 -0400 |
commit | 8589ae15787afc9ab55d5f6a53582e84896faffe (patch) | |
tree | 3164915de82af253641d1ec14bbc4aa52b2fbaf8 /gcc | |
parent | 8ee6eb4e8c7bba61f471d259f84cb11f92120eb7 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ra-build.c | 16 |
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 |