ra-build.c (conflicts_between_webs): For webs that cross a call add conflicts to...
authorPat Haugen <pthaugen@us.ibm.com>
Tue, 3 Aug 2004 15:00:49 +0000 (15:00 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Tue, 3 Aug 2004 15:00:49 +0000 (11:00 -0400)
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

gcc/ChangeLog
gcc/ra-build.c

index 68e347e1456ab5280dac3bb4f92b58cae2141fda..40fd96b3e1190c75f048e9d2f879409d47e74988 100644 (file)
@@ -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.
index 650caa11a16c1d128fc5260b77b1728306446ba6..63fb24e05970bbebc8f369df60c026db6972bc8a 100644 (file)
@@ -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