2012-11-17 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2012 17:59:35 +0000 (17:59 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2012 17:59:35 +0000 (17:59 +0000)
PR rtl-optimization/55342
* lra-assigns.c (spill_for): Try to allocate other reload pseudos
before and after spilling.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193588 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lra-assigns.c

index a7a10b7..68a5ac1 100644 (file)
@@ -1,3 +1,9 @@
+2012-11-17  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/55342
+       * lra-assigns.c (spill_for): Try to allocate other reload pseudos
+       before and after spilling.
+
 2012-11-16  Sandra Loosemore  <sandra@codesourcery.com>
 
        * doc/extend.texi: Various copy-edits to comply with GCC coding
index c558a4d..b1a1c3d 100644 (file)
@@ -795,9 +795,8 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
 {
   int i, j, n, p, hard_regno, best_hard_regno, cost, best_cost, rclass_size;
   int reload_hard_regno, reload_cost;
-  enum machine_mode mode, mode2;
+  enum machine_mode mode;
   enum reg_class rclass;
-  HARD_REG_SET spilled_hard_regs;
   unsigned int spill_regno, reload_regno, uid;
   int insn_pseudos_num, best_insn_pseudos_num;
   lra_live_range_t r;
@@ -838,7 +837,6 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
                           &try_hard_reg_pseudos[hard_regno + j]);
        }
       /* Spill pseudos.         */
-      CLEAR_HARD_REG_SET (spilled_hard_regs);
       EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi)
        if ((int) spill_regno >= lra_constraint_new_regno_start
            && ! bitmap_bit_p (&lra_inheritance_pseudos, spill_regno)
@@ -853,13 +851,6 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
        {
          if (bitmap_bit_p (&insn_conflict_pseudos, spill_regno))
            insn_pseudos_num++;
-         mode2 = PSEUDO_REGNO_MODE (spill_regno);
-         update_lives (spill_regno, true);
-         if (lra_dump_file != NULL)
-           fprintf (lra_dump_file, " spill %d(freq=%d)",
-                    spill_regno, lra_reg_info[spill_regno].freq);
-         add_to_hard_reg_set (&spilled_hard_regs,
-                              mode2, reg_renumber[spill_regno]);
          for (r = lra_reg_info[spill_regno].live_ranges;
               r != NULL;
               r = r->next)
@@ -877,19 +868,26 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
                }
            }
        }
+      n = 0;
+      EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos,
+                                  reload_regno)
+       if ((int) reload_regno != regno
+           && (ira_reg_classes_intersect_p
+               [rclass][regno_allocno_class_array[reload_regno]])
+           && live_pseudos_reg_renumber[reload_regno] < 0
+           && find_hard_regno_for (reload_regno, &cost, -1) < 0)
+         sorted_reload_pseudos[n++] = reload_regno;
+      EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi)
+       {
+         update_lives (spill_regno, true);
+         if (lra_dump_file != NULL)
+           fprintf (lra_dump_file, " spill %d(freq=%d)",
+                    spill_regno, lra_reg_info[spill_regno].freq);
+       }
       hard_regno = find_hard_regno_for (regno, &cost, -1);
       if (hard_regno >= 0)
        {
          assign_temporarily (regno, hard_regno);
-         n = 0;
-         EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos,
-                                      reload_regno)
-           if (live_pseudos_reg_renumber[reload_regno] < 0
-               && (hard_reg_set_intersect_p
-                   (reg_class_contents
-                    [regno_allocno_class_array[reload_regno]],
-                    spilled_hard_regs)))
-             sorted_reload_pseudos[n++] = reload_regno;
          qsort (sorted_reload_pseudos, n, sizeof (int),
                 reload_pseudo_compare_func);
          for (j = 0; j < n; j++)
@@ -898,10 +896,7 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
              lra_assert (live_pseudos_reg_renumber[reload_regno] < 0);
              if ((reload_hard_regno
                   = find_hard_regno_for (reload_regno,
-                                         &reload_cost, -1)) >= 0
-                 && (overlaps_hard_reg_set_p
-                     (spilled_hard_regs,
-                      PSEUDO_REGNO_MODE (reload_regno), reload_hard_regno)))
+                                         &reload_cost, -1)) >= 0)
                {
                  if (lra_dump_file != NULL)
                    fprintf (lra_dump_file, " assign %d(cost=%d)",