aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2005-06-06 14:31:35 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2005-06-06 12:31:35 +0000
commita00d11f077e0577ef4c8f6d08f2c8d52d8ec15ca (patch)
treeb33345b9d09639a34fdfad1df1f1c467319d43a7
parentbbf59fad2d3953258c0a0c13516f8850b9e26c99 (diff)
downloadgcc-a00d11f077e0577ef4c8f6d08f2c8d52d8ec15ca.zip
gcc-a00d11f077e0577ef4c8f6d08f2c8d52d8ec15ca.tar.gz
gcc-a00d11f077e0577ef4c8f6d08f2c8d52d8ec15ca.tar.bz2
predict.c (tree_predict_edge): Don't drop useless predictions; check that it is not called too late in the game.
* 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. From-SVN: r100662
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/cfgrtl.c6
-rw-r--r--gcc/predict.c10
-rw-r--r--gcc/tree-mudflap.c7
4 files changed, 26 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5014a66..84678e2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 2571d4d..f414def 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -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;
diff --git a/gcc/predict.c b/gcc/predict.c
index 22468ac..61cc540 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -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 */
diff --git a/gcc/tree-mudflap.c b/gcc/tree-mudflap.c
index f7ab16e..a6d87cc 100644
--- a/gcc/tree-mudflap.c
+++ b/gcc/tree-mudflap.c
@@ -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. */