]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/55604 (ICE while dumping in remove_some_program_points_and_upd...
authorSteven Bosscher <steven@gcc.gnu.org>
Wed, 5 Dec 2012 23:55:28 +0000 (23:55 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Wed, 5 Dec 2012 23:55:28 +0000 (23:55 +0000)
PR rtl-optimization/55604
* lra-lives.c (lra_create_live_ranges): If there are no referenced
pseudos left, do not compute live ranges.

From-SVN: r194230

gcc/ChangeLog
gcc/lra-lives.c

index efeafd3c73b1eac54d99b7b84f8fab3f15e864ff..b6326f3cd73d31b1bbbd789bc5467d4c7e11d83e 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-05  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR rtl-optimization/55604
+       * lra-lives.c (lra_create_live_ranges): If there are no referenced
+       pseudos left, do not compute live ranges.
+
 2012-12-05  Steven Bosscher  <steven@gcc.gnu.org>
 
        * doc/tm.texi.in (TARGET_CLASS_LIKELY_SPILLED_P): Update documentation.
index c79b95bf5362d90b32791f1de30aedabd2ea50a4..4764ae6e1824e97d222fa1e9c8bd9d2aa48dbcd4 100644 (file)
@@ -915,6 +915,7 @@ lra_create_live_ranges (bool all_p)
   basic_block bb;
   int i, hard_regno, max_regno = max_reg_num ();
   int curr_point;
+  bool have_referenced_pseudos = false;
 
   timevar_push (TV_LRA_CREATE_LIVE_RANGES);
 
@@ -947,10 +948,24 @@ lra_create_live_ranges (bool all_p)
       lra_reg_info[i].call_p = false;
 #endif
       if (i >= FIRST_PSEUDO_REGISTER
-         && lra_reg_info[i].nrefs != 0 && (hard_regno = reg_renumber[i]) >= 0)
-       lra_hard_reg_usage[hard_regno] += lra_reg_info[i].freq;
+         && lra_reg_info[i].nrefs != 0)
+       {
+         if ((hard_regno = reg_renumber[i]) >= 0)
+           lra_hard_reg_usage[hard_regno] += lra_reg_info[i].freq;
+         have_referenced_pseudos = true;
+       }
     }
   lra_free_copies ();
+  /* Under some circumstances, we can have functions without pseudo
+     registers.  For such functions, lra_live_max_point will be 0,
+     see e.g. PR55604, and there's nothing more to do for us here.  */
+  if (! have_referenced_pseudos)
+    {
+      timevar_pop (TV_LRA_CREATE_LIVE_RANGES);
+      return;
+    }
+
   pseudos_live = sparseset_alloc (max_regno);
   pseudos_live_through_calls = sparseset_alloc (max_regno);
   pseudos_live_through_setjumps = sparseset_alloc (max_regno);
@@ -973,6 +988,7 @@ lra_create_live_ranges (bool all_p)
     }
   free (post_order_rev_cfg);
   lra_live_max_point = curr_point;
+  gcc_checking_assert (lra_live_max_point > 0);
   if (lra_dump_file != NULL)
     print_live_ranges (lra_dump_file);
   /* Clean up. */