From 3809e99053b8195163c43228e54831704c35484c Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 3 Jun 2005 21:03:29 +0200 Subject: [PATCH] basic-block.h (remove_predictions_associated_with_edge): Declare. * basic-block.h (remove_predictions_associated_with_edge): Declare. * cfg.c (remove_edge): Use it. * predict.c (remove_predictions_associated_with_edge): New function. From-SVN: r100551 --- gcc/ChangeLog | 6 ++++++ gcc/basic-block.h | 1 + gcc/cfg.c | 1 + gcc/predict.c | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22136dd307b..77123888e64 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-03 Jan Hubicka + + * basic-block.h (remove_predictions_associated_with_edge): Declare. + * cfg.c (remove_edge): Use it. + * predict.c (remove_predictions_associated_with_edge): New function. + 2005-06-03 Pat Haugen * config/rs6000/rs6000.c (rs6000_conditional_register_usage): diff --git a/gcc/basic-block.h b/gcc/basic-block.h index ad89fa5b69e..5c033dfbd4b 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -869,6 +869,7 @@ extern void tree_predict_edge (edge, enum br_predictor, int); extern void rtl_predict_edge (edge, enum br_predictor, int); extern void predict_edge_def (edge, enum br_predictor, enum prediction); extern void guess_outgoing_edge_probabilities (basic_block); +extern void remove_predictions_associated_with_edge (edge); /* In flow.c */ extern void init_flow (void); diff --git a/gcc/cfg.c b/gcc/cfg.c index c1cf389e69f..e842a508346 100644 --- a/gcc/cfg.c +++ b/gcc/cfg.c @@ -349,6 +349,7 @@ make_single_succ_edge (basic_block src, basic_block dest, int flags) void remove_edge (edge e) { + remove_predictions_associated_with_edge (e); execute_on_shrinking_pred (e); disconnect_src (e); diff --git a/gcc/predict.c b/gcc/predict.c index 25f97f707a6..8ca44f69093 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -240,6 +240,24 @@ tree_predict_edge (edge e, enum br_predictor predictor, int probability) i->edge = e; } +/* Remove all predictions on given basic block that are attached + to edge E. */ +void +remove_predictions_associated_with_edge (edge e) +{ + if (e->src->predictions) + { + struct edge_prediction **prediction = &e->src->predictions; + while (*prediction) + { + if ((*prediction)->edge == e) + *prediction = (*prediction)->next; + else + prediction = &((*prediction)->next); + } + } +} + /* Return true when we can store prediction on insn INSN. At the moment we represent predictions only on conditional jumps, not at computed jump or other complicated cases. */