]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/65710 (Thumb1 ICE caused by no register to spill)
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 9 Apr 2015 19:42:24 +0000 (19:42 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 9 Apr 2015 19:42:24 +0000 (19:42 +0000)
2015-04-09  Vladimir Makarov  <vmakarov@redhat.com>

PR target/65710
* lra-int.h (lra_bad_spill_regno_start): New.
* lra.c (lra_bad_spill_regno_start): New.
(lra): Set up lra_bad_spill_regno_start.  Set up
lra_constraint_new_regno_start unconditionally.
* lra-assigns.c (spill_for): Use lra_bad_spill_regno_start for
spill preferences.

From-SVN: r221957

gcc/ChangeLog
gcc/lra-assigns.c
gcc/lra-int.h
gcc/lra.c

index 8bbaeb39cf3d7c2bae0fb1ab34b9286f767288f1..6ab927769cd55c204ec7841b0fdfee9bc74cc2e5 100644 (file)
@@ -1,3 +1,13 @@
+2015-04-09  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/65710
+       * lra-int.h (lra_bad_spill_regno_start): New.
+       * lra.c (lra_bad_spill_regno_start): New.
+       (lra): Set up lra_bad_spill_regno_start.  Set up
+       lra_constraint_new_regno_start unconditionally.
+       * lra-assigns.c (spill_for): Use lra_bad_spill_regno_start for
+       spill preferences.
+
 2015-04-07  Richard Biener  <rguenther@suse.de>
 
        Backport from mainline
index ac5ffd4873301574443c8d731816f3c9fa419a03..fdba267770d8ba778112a763abdf0418200aff3e 100644 (file)
@@ -849,6 +849,7 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap, bool first_p)
   enum reg_class rclass;
   unsigned int spill_regno, reload_regno, uid;
   int insn_pseudos_num, best_insn_pseudos_num;
+  int bad_spills_num, smallest_bad_spills_num;
   lra_live_range_t r;
   bitmap_iterator bi;
 
@@ -867,6 +868,7 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap, bool first_p)
   best_hard_regno = -1;
   best_cost = INT_MAX;
   best_insn_pseudos_num = INT_MAX;
+  smallest_bad_spills_num = INT_MAX;
   rclass_size = ira_class_hard_regs_num[rclass];
   mode = PSEUDO_REGNO_MODE (regno);
   /* Invalidate try_hard_reg_pseudos elements.  */
@@ -895,6 +897,7 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap, bool first_p)
            && ! bitmap_bit_p (&lra_optional_reload_pseudos, spill_regno))
          goto fail;
       insn_pseudos_num = 0;
+      bad_spills_num = 0;
       if (lra_dump_file != NULL)
        fprintf (lra_dump_file, "        Trying %d:", hard_regno);
       sparseset_clear (live_range_reload_inheritance_pseudos);
@@ -902,6 +905,8 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap, bool first_p)
        {
          if (bitmap_bit_p (&insn_conflict_pseudos, spill_regno))
            insn_pseudos_num++;
+         if (spill_regno >= (unsigned int) lra_bad_spill_regno_start)
+           bad_spills_num++;
          for (r = lra_reg_info[spill_regno].live_ranges;
               r != NULL;
               r = r->next)
@@ -972,7 +977,9 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap, bool first_p)
            }
          if (best_insn_pseudos_num > insn_pseudos_num
              || (best_insn_pseudos_num == insn_pseudos_num
-                 && best_cost > cost))
+                 && (bad_spills_num < smallest_bad_spills_num
+                     || (bad_spills_num == smallest_bad_spills_num
+                         && best_cost > cost))))
            {
              best_insn_pseudos_num = insn_pseudos_num;
              best_cost = cost;
index 72620874798cc043aefe96167d16b1e706ea0230..7af67f399531010710dfeac4aeaa753f51f6d656 100644 (file)
@@ -312,6 +312,7 @@ extern bool lra_former_scratch_operand_p (rtx, int);
 
 extern int lra_new_regno_start;
 extern int lra_constraint_new_regno_start;
+extern int lra_bad_spill_regno_start;
 extern bitmap_head lra_inheritance_pseudos;
 extern bitmap_head lra_split_regs;
 extern bitmap_head lra_subreg_reload_pseudos;
index 98f0444356ea13c1b28f288ee13291a3b3784fbc..ed23da3bc439af29dacd351fb6cb87252e688b2a 100644 (file)
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -2215,6 +2215,10 @@ int lra_new_regno_start;
 /* Start of reload pseudo regnos before the new spill pass.  */
 int lra_constraint_new_regno_start;
 
+/* Avoid spilling pseudos with regno more than the following value if
+   it is possible.  */
+int lra_bad_spill_regno_start;
+
 /* Inheritance pseudo regnos before the new spill pass.         */
 bitmap_head lra_inheritance_pseudos;
 
@@ -2306,6 +2310,7 @@ lra (FILE *f)
      permit changing reg classes for pseudos created by this
      simplification.  */
   lra_constraint_new_regno_start = lra_new_regno_start = max_reg_num ();
+  lra_bad_spill_regno_start = INT_MAX;
   remove_scratches ();
   scratch_p = lra_constraint_new_regno_start != max_reg_num ();
 
@@ -2417,11 +2422,13 @@ lra (FILE *f)
       /* Assignment of stack slots changes elimination offsets for
         some eliminations.  So update the offsets here.  */
       lra_eliminate (false, false);
-      /* After switching off inheritance passe, don't forget reload pseudos
-         after spilling sub-pass to avoid LRA cycling in some complicated
-        cases.  */
-      if (lra_inheritance_iter <= LRA_MAX_INHERITANCE_PASSES)
-        lra_constraint_new_regno_start = max_reg_num ();
+      lra_constraint_new_regno_start = max_reg_num ();
+      if (lra_bad_spill_regno_start == INT_MAX
+         && lra_inheritance_iter > LRA_MAX_INHERITANCE_PASSES)
+       /* After switching off inheritance and rematerialization
+          passes, avoid spilling reload pseudos will be created to
+          prevent LRA cycling in some complicated cases.  */
+       lra_bad_spill_regno_start = lra_constraint_new_regno_start;
       lra_constraint_new_insn_uid_start = get_max_uid ();
       lra_assignment_iter_after_spill = 0;
     }