OSDN Git Service

* predict.c (tree_predict_edge): Don't drop useless predictions;
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Jun 2005 12:31:35 +0000 (12:31 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Jun 2005 12:31:35 +0000 (12:31 +0000)
check that it is not called too late in the game.
(gate_estimate_probability): New gate.
(pass_profile): Gate.
* tree-mudflap.c (mf_build_check_statement_for): Do not drop
predictions; update CFG instead.
* cfgrtl.c (rtl_verify_flow_info): Check that predcitions are consumed.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100662 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgrtl.c
gcc/predict.c
gcc/tree-mudflap.c

index 5014a66..84678e2 100644 (file)
@@ -1,3 +1,13 @@
+2005-06-06  Jan Hubicka  <jh@suse.cz>
+
+       * predict.c (tree_predict_edge): Don't drop useless predictions;
+       check that it is not called too late in the game.
+       (gate_estimate_probability): New gate.
+       (pass_profile): Gate.
+       * tree-mudflap.c (mf_build_check_statement_for): Do not drop
+       predictions; update CFG instead.
+       * cfgrtl.c (rtl_verify_flow_info): Check that predcitions are consumed.
+
 2005-06-06  Jie Zhang  <jie.zhang@analog.com>
 
        * config.gcc (bfin*-uclinux*): New.
index 2571d4d..f414def 100644 (file)
@@ -2136,6 +2136,12 @@ rtl_verify_flow_info (void)
       edge e;
       edge_iterator ei;
 
+      if (bb->predictions)
+       {
+         error ("bb prediction set for block %i, but it is not used in RTL land", bb->index);
+         err = 1;
+       }
+
       FOR_EACH_EDGE (e, ei, bb->succs)
        if (e->flags & EDGE_FALLTHRU)
          break;
index 22468ac..61cc540 100644 (file)
@@ -231,8 +231,9 @@ rtl_predict_edge (edge e, enum br_predictor predictor, int probability)
 void
 tree_predict_edge (edge e, enum br_predictor predictor, int probability)
 {
+  gcc_assert (profile_status != PROFILE_GUESSED);
   if ((e->src != ENTRY_BLOCK_PTR && EDGE_COUNT (e->src->succs) > 1)
-      && flag_guess_branch_prob)
+      && flag_guess_branch_prob && optimize)
     {
       struct edge_prediction *i = ggc_alloc (sizeof (struct edge_prediction));
 
@@ -1926,11 +1927,16 @@ choose_function_section (void)
                    UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
 }
 
+static bool
+gate_estimate_probability (void)
+{
+  return flag_guess_branch_prob;
+}
 
 struct tree_opt_pass pass_profile = 
 {
   "profile",                           /* name */
-  NULL,                                        /* gate */
+  gate_estimate_probability,           /* gate */
   tree_estimate_probability,           /* execute */
   NULL,                                        /* sub */
   NULL,                                        /* next */
index f7ab16e..a6d87cc 100644 (file)
@@ -528,14 +528,11 @@ mf_build_check_statement_for (tree base, tree limit,
   make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
   make_single_succ_edge (then_bb, join_bb, EDGE_FALLTHRU);
 
-  /* We expect that the conditional jump we will construct will not
-     be taken very often as it basically is an exception condition.  */
-  predict_edge_def (single_pred_edge (then_bb), PRED_MUDFLAP, NOT_TAKEN);
-
   /* Mark the pseudo-fallthrough edge from cond_bb to join_bb.  */
   e = find_edge (cond_bb, join_bb);
   e->flags = EDGE_FALSE_VALUE;
-  predict_edge_def (e, PRED_MUDFLAP, TAKEN);
+  e->count = cond_bb->count;
+  e->probability = REG_BR_PROB_BASE;
 
   /* Update dominance info.  Note that bb_join's data was
      updated by split_block.  */