lra-assigns.c (assign_by_spills): Add non-reload pseudos assigned to hard register...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 25 Oct 2012 16:54:14 +0000 (16:54 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 25 Oct 2012 16:54:14 +0000 (16:54 +0000)
2012-10-25  Vladimir Makarov  <vmakarov@redhat.com>

* lra-assigns.c (assign_by_spills): Add non-reload pseudos
assigned to hard register to changed_pseudo_bitmap.

From-SVN: r192817

gcc/ChangeLog
gcc/lra-assigns.c

index b9eeeced9df0aa53318bc98651e64cdd7d871b0a..effaa8f317139cc272110c737728a2fa3cbf94c1 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-25  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * lra-assigns.c (assign_by_spills): Add non-reload pseudos
+       assigned to hard register to changed_pseudo_bitmap.
+
 2012-10-25  Ralf Corsépius  <ralf.corsepius@rtems.org>
 
        * config.gcc (microblaze*-*-rtems*): New target.
index b957563716f03e50b2149a9d66126ac9ead86a0d..bcf26afcf292ef97d396d93320255d8f2cf7b4f2 100644 (file)
@@ -1159,6 +1159,7 @@ assign_by_spills (void)
   bitmap_head non_reload_pseudos;
   unsigned int u;
   bitmap_iterator bi;
+  bool reload_p;
   int max_regno = max_reg_num ();
 
   for (n = 0, i = lra_constraint_new_regno_start; i < max_regno; i++)
@@ -1193,12 +1194,12 @@ assign_by_spills (void)
                     lra_reg_info[regno].freq, regno_assign_info[regno].first,
                     regno_assign_info[regno_assign_info[regno].first].freq);
          hard_regno = find_hard_regno_for (regno, &cost, -1);
-         if (hard_regno < 0
-             && ! bitmap_bit_p (&non_reload_pseudos, regno))
+         reload_p = ! bitmap_bit_p (&non_reload_pseudos, regno);
+         if (hard_regno < 0 && reload_p)
            hard_regno = spill_for (regno, &all_spilled_pseudos);
          if (hard_regno < 0)
            {
-             if (! bitmap_bit_p (&non_reload_pseudos, regno))
+             if (reload_p)
                sorted_pseudos[nfails++] = regno;
            }
          else
@@ -1207,6 +1208,11 @@ assign_by_spills (void)
                 pass.  Indicate that it is no longer spilled.  */
              bitmap_clear_bit (&all_spilled_pseudos, regno);
              assign_hard_regno (hard_regno, regno);
+             if (! reload_p)
+               /* As non-reload pseudo assignment is changed we
+                  should reconsider insns referring for the
+                  pseudo.  */
+               bitmap_set_bit (&changed_pseudo_bitmap, regno);
            }
        }
       if (nfails == 0)
@@ -1308,9 +1314,9 @@ assign_by_spills (void)
          if (hard_regno >= 0)
            {
              assign_hard_regno (hard_regno, regno);
-         /* We change allocation for non-reload pseudo on this
-            iteration -- mark the pseudo for invalidation of used
-            alternatives of insns containing the pseudo.  */
+             /* We change allocation for non-reload pseudo on this
+                iteration -- mark the pseudo for invalidation of used
+                alternatives of insns containing the pseudo.  */
              bitmap_set_bit (&changed_pseudo_bitmap, regno);
            }
        }