re PR middle-end/38587 (IRA doesn't preserve local variables after setjmp)
authorVladimir Makarov <vmakarov@redhat.com>
Wed, 21 Jan 2009 20:18:03 +0000 (20:18 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Wed, 21 Jan 2009 20:18:03 +0000 (20:18 +0000)
2009-01-21  Vladimir Makarov  <vmakarov@redhat.com>

PR middle-end/38587
* ira-color.c (coalesce_spill_slots): Don't coalesce allocnos
crossing setjmps.

From-SVN: r143554

gcc/ChangeLog
gcc/ira-color.c

index 1fba853ce67172a79f64fb746eef0950c30ca15e..74824ec9ebdf32b860ff4b1182f17b4ddeb2f174 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-21  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR middle-end/38587
+       * ira-color.c (coalesce_spill_slots): Don't coalesce allocnos
+       crossing setjmps.
+
 2009-01-21  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        PR bootstrap/37660
index f1adb1da06a27a03dd1a46a95d047d4b691235c4..31f48623bbdfec037a46711304cf2506805878f2 100644 (file)
@@ -2537,6 +2537,7 @@ coalesce_spill_slots (ira_allocno_t *spilled_coalesced_allocnos, int num)
   int i, j, n, last_coalesced_allocno_num;
   ira_allocno_t allocno, a;
   bool merged_p = false;
+  bitmap set_jump_crosses = regstat_get_setjmp_crosses ();
 
   slot_coalesced_allocnos_live_ranges
     = (allocno_live_range_t *) ira_allocate (sizeof (allocno_live_range_t)
@@ -2550,6 +2551,7 @@ coalesce_spill_slots (ira_allocno_t *spilled_coalesced_allocnos, int num)
     {
       allocno = spilled_coalesced_allocnos[i];
       if (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) != allocno
+         || bitmap_bit_p (set_jump_crosses, ALLOCNO_REGNO (allocno))
          || (ALLOCNO_REGNO (allocno) < ira_reg_equiv_len
              && (ira_reg_equiv_const[ALLOCNO_REGNO (allocno)] != NULL_RTX
                  || ira_reg_equiv_invariant_p[ALLOCNO_REGNO (allocno)])))
@@ -2559,6 +2561,7 @@ coalesce_spill_slots (ira_allocno_t *spilled_coalesced_allocnos, int num)
          a = spilled_coalesced_allocnos[j];
          n = ALLOCNO_TEMP (a);
          if (ALLOCNO_FIRST_COALESCED_ALLOCNO (a) == a
+             && ! bitmap_bit_p (set_jump_crosses, ALLOCNO_REGNO (a))
              && (ALLOCNO_REGNO (a) >= ira_reg_equiv_len
                  || (! ira_reg_equiv_invariant_p[ALLOCNO_REGNO (a)]
                      && ira_reg_equiv_const[ALLOCNO_REGNO (a)] == NULL_RTX))