aboutsummaryrefslogtreecommitdiff
path: root/gcc/predict.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/predict.c')
-rw-r--r--gcc/predict.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/gcc/predict.c b/gcc/predict.c
index cedb3d5..a20b352 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -1293,10 +1293,11 @@ tree_bb_level_predictions (void)
{
block_stmt_iterator bsi = bsi_last (bb);
- for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi);)
{
tree stmt = bsi_stmt (bsi);
tree decl;
+ bool next = false;
switch (TREE_CODE (stmt))
{
@@ -1319,9 +1320,17 @@ call_expr:;
predict_paths_leading_to (bb, PRED_COLD_FUNCTION,
NOT_TAKEN);
break;
+ case PREDICT_EXPR:
+ predict_paths_leading_to (bb, PREDICT_EXPR_PREDICTOR (stmt),
+ PREDICT_EXPR_OUTCOME (stmt));
+ bsi_remove (&bsi, true);
+ next = true;
+ break;
default:
break;
}
+ if (!next)
+ bsi_next (&bsi);
}
}
}
@@ -1915,6 +1924,21 @@ gate_estimate_probability (void)
return flag_guess_branch_prob;
}
+/* Build PREDICT_EXPR. */
+tree
+build_predict_expr (enum br_predictor predictor, enum prediction taken)
+{
+ tree t = build1 (PREDICT_EXPR, NULL_TREE, build_int_cst (NULL, predictor));
+ PREDICT_EXPR_OUTCOME (t) = taken;
+ return t;
+}
+
+const char *
+predictor_name (enum br_predictor predictor)
+{
+ return predictor_info[predictor].name;
+}
+
struct tree_opt_pass pass_profile =
{
"profile", /* name */