basic-block.h (profile_staus): New global variable.
authorJan Hubicka <jh@suse.cz>
Wed, 4 Aug 2004 21:37:06 +0000 (23:37 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 4 Aug 2004 21:37:06 +0000 (21:37 +0000)
* basic-block.h (profile_staus): New global variable.
* cfg.c (profile_status): Declare.
(check_bb_profile): Break out from ....; use profile_status
(dump_flow_info): ... here.
* cfgbuild.c (find_basic_blocks): Set profile_status.
* cfgexpand.c (tree_expand_cfg): Likewise.
* predict.c (estimate_probability): Likewise.
* profile.c (branch_prob): Likewise.
* tree-cfg.c (build_tree_cfg): Likewise.
(dump_function_to_file): Use check_bb_profile.
* tree-pretty-print (dump_bb_header): Likewise.
* tree-profile.c (do_tree_profiling): Cleanup.

From-SVN: r85579

gcc/ChangeLog
gcc/basic-block.h
gcc/cfg.c
gcc/cfgbuild.c
gcc/cfgexpand.c
gcc/predict.c
gcc/profile.c
gcc/tree-cfg.c
gcc/tree-pretty-print.c
gcc/tree-profile.c

index 506b4adbe6adc740a5f1c561f8a6a24034146895..9f50220cb06a4f59a37dfd309ff480ee168bf84f 100644 (file)
@@ -1,3 +1,18 @@
+2004-08-04  Jan Hubicka  <jh@suse.cz>
+
+       * basic-block.h (profile_staus): New global variable.
+       * cfg.c (profile_status): Declare.
+       (check_bb_profile): Break out from ....; use profile_status
+       (dump_flow_info): ... here.
+       * cfgbuild.c (find_basic_blocks): Set profile_status.
+       * cfgexpand.c (tree_expand_cfg): Likewise.
+       * predict.c (estimate_probability): Likewise.
+       * profile.c (branch_prob): Likewise.
+       * tree-cfg.c (build_tree_cfg): Likewise.
+       (dump_function_to_file): Use check_bb_profile.
+       * tree-pretty-print (dump_bb_header): Likewise.
+       * tree-profile.c (do_tree_profiling): Cleanup.
+
 2004-08-04  Zack Weinberg  <zack@codesourcery.com>
 
        * Makefile.in (RTL_BASE_H, RTL_H): Correct.
index c42a66d6f0a5e525806b43058adecd21f1f1789c..76f13687a522693ab4a841e45bbda9136180a2c1 100644 (file)
@@ -330,6 +330,14 @@ extern int last_basic_block;
 
 extern int n_edges;
 
+/* Signalize the status of profile information in the CFG.  */
+extern enum profile_status
+{
+  PROFILE_ABSENT,
+  PROFILE_GUESSED,
+  PROFILE_READ
+} profile_status;
+
 /* Index by basic block number, get basic block struct info.  */
 
 extern GTY(()) varray_type basic_block_info;
@@ -723,6 +731,7 @@ extern basic_block first_dom_son (enum cdi_direction, basic_block);
 extern basic_block next_dom_son (enum cdi_direction, basic_block);
 extern edge try_redirect_by_replacing_jump (edge, basic_block, bool);
 extern void break_superblocks (void);
+extern void check_bb_profile (basic_block, FILE *);
 
 #include "cfghooks.h"
 
index 4b6de6d66a8f7196d8f7110e3983a44e4142a727..cee3cf2211c65e2b8df8e632479d8d745dded021 100644 (file)
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -94,6 +94,9 @@ alloc_pool rbi_pool;
 
 void debug_flow_info (void);
 static void free_edge (edge);
+
+/* Indicate the presence of the profile.  */
+enum profile_status profile_status;
 \f
 /* Called once at initialization time.  */
 
@@ -468,6 +471,53 @@ clear_bb_flags (void)
     bb->flags = 0;
 }
 \f
+/* Check the consistency of profile information.  We can't do that
+   in verify_flow_info, as the counts may get invalid for incompletely
+   solved graphs, later eliminating of conditionals or roundoff errors.
+   It is still practical to have them reported for debugging of simple
+   testcases.  */
+void
+check_bb_profile (basic_block bb, FILE * file)
+{
+  edge e;
+  int sum = 0;
+  gcov_type lsum;
+
+  if (profile_status == PROFILE_ABSENT)
+    return;
+
+  if (bb != EXIT_BLOCK_PTR)
+    {
+      for (e = bb->succ; e; e = e->succ_next)
+       sum += e->probability;
+      if (bb->succ && abs (sum - REG_BR_PROB_BASE) > 100)
+       fprintf (file, "Invalid sum of outgoing probabilities %.1f%%\n",
+                sum * 100.0 / REG_BR_PROB_BASE);
+      lsum = 0;
+      for (e = bb->succ; e; e = e->succ_next)
+       lsum += e->count;
+      if (bb->succ && (lsum - bb->count > 100 || lsum - bb->count < -100))
+       fprintf (file, "Invalid sum of outgoing counts %i, should be %i\n",
+                (int) lsum, (int) bb->count);
+    }
+  if (bb != ENTRY_BLOCK_PTR)
+    {
+      sum = 0;
+      for (e = bb->pred; e; e = e->pred_next)
+       sum += EDGE_FREQUENCY (e);
+      if (abs (sum - bb->frequency) > 100)
+       fprintf (file,
+                "Invalid sum of incomming frequencies %i, should be %i\n",
+                sum, bb->frequency);
+      lsum = 0;
+      for (e = bb->pred; e; e = e->pred_next)
+       lsum += e->count;
+      if (lsum - bb->count > 100 || lsum - bb->count < -100)
+       fprintf (file, "Invalid sum of incomming counts %i, should be %i\n",
+                (int) lsum, (int) bb->count);
+    }
+}
+\f
 void
 dump_flow_info (FILE *file)
 {
@@ -527,8 +577,6 @@ dump_flow_info (FILE *file)
   FOR_EACH_BB (bb)
     {
       edge e;
-      int sum;
-      gcov_type lsum;
 
       fprintf (file, "\nBasic block %d ", bb->index);
       fprintf (file, "prev %d, next %d, ",
@@ -555,39 +603,23 @@ dump_flow_info (FILE *file)
 
       fprintf (file, "\nRegisters live at end:");
       dump_regset (bb->global_live_at_end, file);
-
+  
       putc ('\n', file);
 
-      /* Check the consistency of profile information.  We can't do that
-        in verify_flow_info, as the counts may get invalid for incompletely
-        solved graphs, later eliminating of conditionals or roundoff errors.
-        It is still practical to have them reported for debugging of simple
-        testcases.  */
-      sum = 0;
-      for (e = bb->succ; e; e = e->succ_next)
-       sum += e->probability;
-      if (bb->succ && abs (sum - REG_BR_PROB_BASE) > 100)
-       fprintf (file, "Invalid sum of outgoing probabilities %.1f%%\n",
-                sum * 100.0 / REG_BR_PROB_BASE);
-      sum = 0;
-      for (e = bb->pred; e; e = e->pred_next)
-       sum += EDGE_FREQUENCY (e);
-      if (abs (sum - bb->frequency) > 100)
-       fprintf (file,
-                "Invalid sum of incomming frequencies %i, should be %i\n",
-                sum, bb->frequency);
-      lsum = 0;
-      for (e = bb->pred; e; e = e->pred_next)
-       lsum += e->count;
-      if (lsum - bb->count > 100 || lsum - bb->count < -100)
-       fprintf (file, "Invalid sum of incomming counts %i, should be %i\n",
-                (int)lsum, (int)bb->count);
-      lsum = 0;
-      for (e = bb->succ; e; e = e->succ_next)
-       lsum += e->count;
-      if (bb->succ && (lsum - bb->count > 100 || lsum - bb->count < -100))
-       fprintf (file, "Invalid sum of incomming counts %i, should be %i\n",
-                (int)lsum, (int)bb->count);
+      if (bb->global_live_at_start)
+       {
+         fprintf (file, "\nRegisters live at start:");
+         dump_regset (bb->global_live_at_start, file);
+       }
+
+      if (bb->global_live_at_end)
+       {
+         fprintf (file, "\nRegisters live at end:");
+         dump_regset (bb->global_live_at_end, file);
+       }
+
+      putc ('\n', file);
+      check_bb_profile (bb, file);
     }
 
   putc ('\n', file);
index 3316f02418406d87ebbc6ea35d16a42bc613a04b..cb451efe4f2395628228204fe18860becd751672 100644 (file)
@@ -546,6 +546,8 @@ find_basic_blocks (rtx f, int nregs ATTRIBUTE_UNUSED,
 
   find_basic_blocks_1 (f);
 
+  profile_status = PROFILE_ABSENT;
+
   /* Discover the edges of our cfg.  */
   make_edges (ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR->prev_bb, 0);
 
index aa5911890eef231a04977f81c7c2162c517a3dac..faa4635aa31926087a0e6d41b426ee0581c3a457 100644 (file)
@@ -433,6 +433,8 @@ tree_expand_cfg (void)
               IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl)));
     }
 
+  profile_status = PROFILE_ABSENT;
+
   /* Some backends want to know that we are expanding to RTL.  */
   currently_expanding_to_rtl = 1;
 
index e55427d9acc930e504345be716ad2736d4e166d2..d89282daa89c50924f0e700d7859f5556f97f194 100644 (file)
@@ -805,6 +805,8 @@ estimate_probability (struct loops *loops_info)
     }
   estimate_bb_frequencies (loops_info);
   free_dominance_info (CDI_POST_DOMINATORS);
+  if (profile_status == PROFILE_ABSENT)
+    profile_status = PROFILE_GUESSED;
 }
 \f
 
@@ -988,6 +990,8 @@ tree_estimate_probability (void)
   flow_loops_free (&loops_info);
   if (dump_file && (dump_flags & TDF_DETAILS))
     dump_tree_cfg (dump_file, dump_flags);
+  if (profile_status == PROFILE_ABSENT)
+    profile_status = PROFILE_GUESSED;
 }
 \f
 /* __builtin_expect dropped tokens into the insn stream describing expected
index ad62f87ccb4552da8c52dd4860fe66fbb4f49d12..002e7a1b694f870169317a55eadc1166153fe149 100644 (file)
@@ -1005,6 +1005,7 @@ branch_prob (void)
     }
 
   free_edge_list (el);
+  profile_status = PROFILE_READ;
 }
 \f
 /* Union find algorithm implementation for the basic blocks using
index 576531610eb9d78baa8858f7f7c2704a2c689310..86ac7ee3a92303c76cc3872e70d131eb7ec850fa 100644 (file)
@@ -125,6 +125,7 @@ build_tree_cfg (tree *tp)
 
   /* Initialize the basic block array.  */
   init_flow ();
+  profile_status = PROFILE_ABSENT;
   n_basic_blocks = 0;
   last_basic_block = 0;
   VARRAY_BB_INIT (basic_block_info, initial_cfg_capacity, "basic_block_info");
@@ -4396,6 +4397,7 @@ dump_function_to_file (tree fn, FILE *file, int flags)
   if (basic_block_info)
     {
       /* Make a CFG based dump.  */
+      check_bb_profile (ENTRY_BLOCK_PTR, file);
       if (!ignore_topmost_bind)
        fprintf (file, "{\n");
 
@@ -4406,6 +4408,7 @@ dump_function_to_file (tree fn, FILE *file, int flags)
        dump_generic_bb (file, bb, 2, flags);
        
       fprintf (file, "}\n");
+      check_bb_profile (EXIT_BLOCK_PTR, file);
     }
   else
     {
index a3a3a01d75e90b373f92502a9569643e554509f5..1821700635aebbed47b8478d8b1a091e78018e56 100644 (file)
@@ -2144,6 +2144,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
          pp_newline (buffer);
        }
     }
+  pp_write_text_to_stream (buffer);
+  check_bb_profile (bb, buffer->buffer->stream);
 }
 
 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
index c1498ea8d5c3c4782681b4d40e18322b22bd279b..1a7b744f3a729a91d8be7915b00e1163a01b0b7c 100644 (file)
@@ -146,7 +146,8 @@ tree_gen_const_delta_profiler (struct histogram_value *value ATTRIBUTE_UNUSED,
    If it is, set up hooks for tree-based profiling.
    Gate for pass_tree_profile.  */
 
-static bool do_tree_profiling (void) {
+static bool do_tree_profiling (void)
+{
   if (flag_tree_based_profiling)
     {
       tree_register_profile_hooks ();