]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/26375 (Swing modulo scheduling results in ICE)
authorKenneth Zadeck <zadeck@naturalbridge.com>
Tue, 23 May 2006 01:17:29 +0000 (01:17 +0000)
committerKenneth Zadeck <zadeck@gcc.gnu.org>
Tue, 23 May 2006 01:17:29 +0000 (01:17 +0000)
2006-05-22  Kenneth Zadeck <zadeck@naturalbridge.com>

PR rtl-optimization/26375
PR rtl-optimization/26855
* df-problems (df_ru_bb_local_compute_process_def): Removed update
to gen set.
(df_ru_bb_local_compute): Reversed statements and removed bogus
comment explaining why they should be in wrong order.
(df_ru_dump, df_rd_dump): Enhanced debug info.
* modulo-sched.c (sms_schedule, tree_opt_pass pass_sms): Enhanced
debug info.
* ddg.c (add_deps_for_def): Converted use of reaching defs to
        reaching uses and fixed space problem.

From-SVN: r114010

gcc/ChangeLog
gcc/ddg.c
gcc/df-problems.c
gcc/modulo-sched.c

index 988d4f9924ed00ba2ae9e0ab13510401d9602f28..196804b1bd19847d32e60173d6a10fb72509517f 100644 (file)
@@ -1,3 +1,17 @@
+2006-05-22  Kenneth Zadeck <zadeck@naturalbridge.com>
+
+       PR rtl-optimization/26375
+       PR rtl-optimization/26855
+       * df-problems (df_ru_bb_local_compute_process_def): Removed update
+       to gen set.
+       (df_ru_bb_local_compute): Reversed statements and removed bogus
+       comment explaining why they should be in wrong order.
+       (df_ru_dump, df_rd_dump): Enhanced debug info.     
+       * modulo-sched.c (sms_schedule, tree_opt_pass pass_sms): Enhanced
+       debug info.       
+       * ddg.c (add_deps_for_def): Converted use of reaching defs to
+        reaching uses and fixed space problem.
+
 2006-05-23  Jan Hubicka  <jh@suse.cz>
 
        * cgraphunit.c (decide_is_function_needed): Also nested functions
index c00e4991157e439c173818e8e278a00f5e689a3b..c59ee6ea8f19009e18b5f58384a5ab7a1fe3ce86 100644 (file)
--- a/gcc/ddg.c
+++ b/gcc/ddg.c
@@ -225,7 +225,7 @@ static void
 add_deps_for_def (ddg_ptr g, struct df *df, struct df_ref *rd)
 {
   int regno = DF_REF_REGNO (rd);
-  struct df_rd_bb_info *bb_info = DF_RD_BB_INFO (df, g->bb);
+  struct df_ru_bb_info *bb_info = DF_RU_BB_INFO (df, g->bb);
   struct df_link *r_use;
   int use_before_def = false;
   rtx def_insn = DF_REF_INSN (rd);
@@ -338,7 +338,7 @@ build_inter_loop_deps (ddg_ptr g, struct df *df)
 
       /* We are interested in uses of this BB.  */
       if (BLOCK_FOR_INSN (use->insn) == g->bb)
-       add_deps_for_use (g, df,use);
+       add_deps_for_use (g, df, use);
     }
 }
 
index 8c5ed6d7bd3863dd8c2aef16d76a6a763dd11c40..051ec333b67cdfa9a760b792be62d2d6cffe841d 100644 (file)
@@ -440,15 +440,15 @@ df_ru_bb_local_compute_process_def (struct dataflow *dflow,
          unsigned int n_uses = DF_REG_USE_GET (df, regno)->n_refs;
          if (!bitmap_bit_p (seen_in_block, regno))
            {
-             /* The first def for regno, causes the kill info to be
-                generated and the gen information to cleared.  */
+             /* The first def for regno in the insn, causes the kill
+                info to be generated.  Do not modify the gen set
+                because the only values in it are the uses from here
+                to the top of the block and this def does not effect
+                them.  */
              if (!bitmap_bit_p (seen_in_insn, regno))
                {
                  if (n_uses > DF_SPARSE_THRESHOLD)
-                   {
-                     bitmap_set_bit (bb_info->sparse_kill, regno);
-                     bitmap_clear_range (bb_info->gen, begin, n_uses);
-                   }
+                   bitmap_set_bit (bb_info->sparse_kill, regno);
                  else
                    {
                      struct df_ru_problem_data * problem_data
@@ -457,7 +457,6 @@ df_ru_bb_local_compute_process_def (struct dataflow *dflow,
                        = df_ref_bitmap (problem_data->use_sites, regno, 
                                       begin, n_uses);
                      bitmap_ior_into (bb_info->kill, uses);
-                     bitmap_and_compl_into (bb_info->gen, uses);
                    }
                }
              bitmap_set_bit (seen_in_insn, regno);
@@ -520,16 +519,12 @@ df_ru_bb_local_compute (struct dataflow *dflow, unsigned int bb_index)
       if (!INSN_P (insn))
        continue;
 
-      df_ru_bb_local_compute_process_def (dflow, bb_info, 
-                                         DF_INSN_UID_DEFS (df, uid), 0);
-
-      /* The use processing must happen after the defs processing even
-        though the uses logically happen first since the defs clear
-        the gen set. Otherwise, a use for regno occuring in the same
-        instruction as a def for regno would be cleared.  */ 
       df_ru_bb_local_compute_process_use (bb_info, 
                                          DF_INSN_UID_USES (df, uid), 0);
 
+      df_ru_bb_local_compute_process_def (dflow, bb_info, 
+                                         DF_INSN_UID_DEFS (df, uid), 0);
+
       bitmap_ior_into (seen_in_block, seen_in_insn);
       bitmap_clear (seen_in_insn);
     }
@@ -765,13 +760,13 @@ df_ru_dump (struct dataflow *dflow, FILE *file)
       if (!bb_info->in)
        continue;
       
-      fprintf (file, "  in  \t");
+      fprintf (file, "  in  \t(%d)\n", (int) bitmap_count_bits (bb_info->in));
       dump_bitmap (file, bb_info->in);
-      fprintf (file, "  gen \t");
+      fprintf (file, "  gen \t(%d)\n", (int) bitmap_count_bits (bb_info->gen));
       dump_bitmap (file, bb_info->gen);
-      fprintf (file, "  kill\t");
+      fprintf (file, "  kill\t(%d)\n", (int) bitmap_count_bits (bb_info->kill));
       dump_bitmap (file, bb_info->kill);
-      fprintf (file, "  out \t");
+      fprintf (file, "  out \t(%d)\n", (int) bitmap_count_bits (bb_info->out));
       dump_bitmap (file, bb_info->out);
     }
 }
@@ -1276,13 +1271,13 @@ df_rd_dump (struct dataflow *dflow, FILE *file)
       if (!bb_info->in)
        continue;
       
-      fprintf (file, "  in\t(%d)\n", (int) bitmap_count_bits (bb_info->in));
+      fprintf (file, "  in  \t(%d)\n", (int) bitmap_count_bits (bb_info->in));
       dump_bitmap (file, bb_info->in);
       fprintf (file, "  gen \t(%d)\n", (int) bitmap_count_bits (bb_info->gen));
       dump_bitmap (file, bb_info->gen);
       fprintf (file, "  kill\t(%d)\n", (int) bitmap_count_bits (bb_info->kill));
       dump_bitmap (file, bb_info->kill);
-      fprintf (file, "  out\t(%d)\n", (int) bitmap_count_bits (bb_info->out));
+      fprintf (file, "  out \t(%d)\n", (int) bitmap_count_bits (bb_info->out));
       dump_bitmap (file, bb_info->out);
     }
 }
index 8b620c4b119d91e56ed36fb42c765e5904daac72..56df63c894c14768a4657ade6a7cc2ac180d3263 100644 (file)
@@ -940,6 +940,9 @@ sms_schedule (void)
   df_chain_add_problem (df, DF_DU_CHAIN | DF_UD_CHAIN);
   df_analyze (df);
 
+  if (dump_file)
+    df_dump (df, dump_file);
+
   /* Allocate memory to hold the DDG array one entry for each loop.
      We use loop->num as index into this array.  */
   g_arr = XCNEWVEC (ddg_ptr, loops->num);
@@ -2545,7 +2548,7 @@ struct tree_opt_pass pass_sms =
   0,                                    /* properties_required */
   0,                                    /* properties_provided */
   0,                                    /* properties_destroyed */
-  0,                                    /* todo_flags_start */
+  TODO_dump_func,                       /* todo_flags_start */
   TODO_dump_func |
   TODO_ggc_collect,                     /* todo_flags_finish */
   'm'                                   /* letter */