]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/58960 (ICE in bmp_iter_set_init)
authorAndrey Belevantsev <abel@ispras.ru>
Tue, 18 Feb 2014 05:41:29 +0000 (09:41 +0400)
committerAndrey Belevantsev <abel@gcc.gnu.org>
Tue, 18 Feb 2014 05:41:29 +0000 (09:41 +0400)
        PR rtl-optimization/58960
        * haifa-sched.c (alloc_global_sched_pressure_data): New,
        factored out from ...
        (sched_init): ... here.
        (free_global_sched_pressure_data): New, factored out from ...
        (sched_finish): ... here.
        * sched-int.h (free_global_sched_pressure_data): Declare.
        * sched-rgn.c (nr_regions_initial): New static global.
        (haifa_find_rgns): Initialize it.
        (schedule_region): Disable sched-pressure for the newly
        generated regions.

From-SVN: r207832

gcc/ChangeLog
gcc/haifa-sched.c
gcc/sched-int.h
gcc/sched-rgn.c

index c0e3b699b6ea1e51c46d64ab31bae7b9fc67cbfd..dbd04dbef42dceb536a33246aed1ac5278116403 100644 (file)
@@ -1,3 +1,17 @@
+2014-02-18  Andrey Belevantsev  <abel@ispras.ru>
+
+       PR rtl-optimization/58960
+       * haifa-sched.c (alloc_global_sched_pressure_data): New,
+       factored out from ...
+       (sched_init): ... here.
+       (free_global_sched_pressure_data): New, factored out from ...
+       (sched_finish): ... here.
+       * sched-int.h (free_global_sched_pressure_data): Declare.
+       * sched-rgn.c (nr_regions_initial): New static global.
+       (haifa_find_rgns): Initialize it.
+       (schedule_region): Disable sched-pressure for the newly
+       generated regions.
+
 2014-02-17  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-stmts.c (free_stmt_vec_info): Clear BB and
index 4d51984f023d4fc6f63b1a4b5654affe13bd0943..e0d467497fadb9ad370fe749358b26e5224af626 100644 (file)
@@ -6553,6 +6553,54 @@ setup_sched_dump (void)
                ? stderr : dump_file);
 }
 
+/* Allocate data for register pressure sensitive scheduling.  */
+static void
+alloc_global_sched_pressure_data (void)
+{
+  if (sched_pressure != SCHED_PRESSURE_NONE)
+    {
+      int i, max_regno = max_reg_num ();
+
+      if (sched_dump != NULL)
+       /* We need info about pseudos for rtl dumps about pseudo
+          classes and costs.  */
+       regstat_init_n_sets_and_refs ();
+      ira_set_pseudo_classes (true, sched_verbose ? sched_dump : NULL);
+      sched_regno_pressure_class
+       = (enum reg_class *) xmalloc (max_regno * sizeof (enum reg_class));
+      for (i = 0; i < max_regno; i++)
+       sched_regno_pressure_class[i]
+         = (i < FIRST_PSEUDO_REGISTER
+            ? ira_pressure_class_translate[REGNO_REG_CLASS (i)]
+            : ira_pressure_class_translate[reg_allocno_class (i)]);
+      curr_reg_live = BITMAP_ALLOC (NULL);
+      if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
+       {
+         saved_reg_live = BITMAP_ALLOC (NULL);
+         region_ref_regs = BITMAP_ALLOC (NULL);
+       }
+    }
+}
+
+/*  Free data for register pressure sensitive scheduling.  Also called
+    from schedule_region when stopping sched-pressure early.  */
+void
+free_global_sched_pressure_data (void)
+{
+  if (sched_pressure != SCHED_PRESSURE_NONE)
+    {
+      if (regstat_n_sets_and_refs != NULL)
+       regstat_free_n_sets_and_refs ();
+      if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
+       {
+         BITMAP_FREE (region_ref_regs);
+         BITMAP_FREE (saved_reg_live);
+       }
+      BITMAP_FREE (curr_reg_live);
+      free (sched_regno_pressure_class);
+    }
+}
+
 /* Initialize some global state for the scheduler.  This function works
    with the common data shared between all the schedulers.  It is called
    from the scheduler specific initialization routine.  */
@@ -6656,29 +6704,7 @@ sched_init (void)
   if (targetm.sched.init_global)
     targetm.sched.init_global (sched_dump, sched_verbose, get_max_uid () + 1);
 
-  if (sched_pressure != SCHED_PRESSURE_NONE)
-    {
-      int i, max_regno = max_reg_num ();
-
-      if (sched_dump != NULL)
-       /* We need info about pseudos for rtl dumps about pseudo
-          classes and costs.  */
-       regstat_init_n_sets_and_refs ();
-      ira_set_pseudo_classes (true, sched_verbose ? sched_dump : NULL);
-      sched_regno_pressure_class
-       = (enum reg_class *) xmalloc (max_regno * sizeof (enum reg_class));
-      for (i = 0; i < max_regno; i++)
-       sched_regno_pressure_class[i]
-         = (i < FIRST_PSEUDO_REGISTER
-            ? ira_pressure_class_translate[REGNO_REG_CLASS (i)]
-            : ira_pressure_class_translate[reg_allocno_class (i)]);
-      curr_reg_live = BITMAP_ALLOC (NULL);
-      if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
-       {
-         saved_reg_live = BITMAP_ALLOC (NULL);
-         region_ref_regs = BITMAP_ALLOC (NULL);
-       }
-    }
+  alloc_global_sched_pressure_data ();
 
   curr_state = xmalloc (dfa_state_size);
 }
@@ -6777,18 +6803,7 @@ void
 sched_finish (void)
 {
   haifa_finish_h_i_d ();
-  if (sched_pressure != SCHED_PRESSURE_NONE)
-    {
-      if (regstat_n_sets_and_refs != NULL)
-       regstat_free_n_sets_and_refs ();
-      if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
-       {
-         BITMAP_FREE (region_ref_regs);
-         BITMAP_FREE (saved_reg_live);
-       }
-      BITMAP_FREE (curr_reg_live);
-      free (sched_regno_pressure_class);
-    }
+  free_global_sched_pressure_data ();
   free (curr_state);
 
   if (targetm.sched.finish_global)
index 2cec6247230e62c948a4d5af37184c6a14de2a1c..d04bf0876b1f20be6b1a87e835fc132e59807cc5 100644 (file)
@@ -1340,6 +1340,7 @@ extern void debug_ds (ds_t);
 extern void initialize_live_range_shrinkage (void);
 extern void finish_live_range_shrinkage (void);
 extern void sched_init_region_reg_pressure_info (void);
+extern void free_global_sched_pressure_data (void);
 extern int haifa_classify_insn (const_rtx);
 extern void get_ebb_head_tail (basic_block, basic_block, rtx *, rtx *);
 extern int no_real_insns_p (const_rtx, const_rtx);
index 406dc1facd663fcbaeaff6591b2b711a72355009..0573b6a6e8f77a94e0f7b75d44300d1fbc41cfce 100644 (file)
@@ -79,6 +79,9 @@ static int is_cfg_nonregular (void);
 /* Number of regions in the procedure.  */
 int nr_regions = 0;
 
+/* Same as above before adding any new regions.  */
+static int nr_regions_initial = 0;
+
 /* Table of region descriptions.  */
 region *rgn_table = NULL;
 
@@ -1064,6 +1067,7 @@ haifa_find_rgns (void)
        BLOCK_TO_BB (bb->index) = 0;
       }
 
+  nr_regions_initial = nr_regions;
   free (max_hdr);
   free (degree);
   free (stack);
@@ -2991,6 +2995,15 @@ schedule_region (int rgn)
 
   rgn_n_insns = 0;
 
+  /* Do not support register pressure sensitive scheduling for the new regions
+     as we don't update the liveness info for them.  */
+  if (rgn >= nr_regions_initial)
+    {
+      if (sched_pressure != SCHED_PRESSURE_NONE)
+       free_global_sched_pressure_data ();
+      sched_pressure = SCHED_PRESSURE_NONE;
+    }
+
   rgn_setup_region (rgn);
 
   /* Don't schedule region that is marked by