Commit 28cd6814 by Martin Liska Committed by Martin Liska

Introduce filtering for edge_predictions.

	* predict.c (filter_predictions): New function.
	(remove_predictions_associated_with_edge): Use the filter
	function.
	(equal_edge_p): New function.

From-SVN: r237253
parent 7d82e8e4
2016-06-09 Martin Liska <mliska@suse.cz>
* predict.c (filter_predictions): New function.
(remove_predictions_associated_with_edge): Use the filter
function.
(equal_edge_p): New function.
2016-06-09 Stefan Bruens <stefan.bruens@rwth-aachen.de> 2016-06-09 Stefan Bruens <stefan.bruens@rwth-aachen.de>
* doc/invoke.texi (ARM Options): Use lexicographical ordering. * doc/invoke.texi (ARM Options): Use lexicographical ordering.
......
...@@ -609,16 +609,16 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability) ...@@ -609,16 +609,16 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
} }
} }
/* Remove all predictions on given basic block that are attached /* Filter edge predictions PREDS by a function FILTER. DATA are passed
to edge E. */ to the filter function. */
void void
remove_predictions_associated_with_edge (edge e) filter_predictions (edge_prediction **preds,
bool (*filter) (edge_prediction *, void *), void *data)
{ {
if (!bb_predictions) if (!bb_predictions)
return; return;
edge_prediction **preds = bb_predictions->get (e->src);
if (preds) if (preds)
{ {
struct edge_prediction **prediction = preds; struct edge_prediction **prediction = preds;
...@@ -626,18 +626,39 @@ remove_predictions_associated_with_edge (edge e) ...@@ -626,18 +626,39 @@ remove_predictions_associated_with_edge (edge e)
while (*prediction) while (*prediction)
{ {
if ((*prediction)->ep_edge == e) if ((*filter) (*prediction, data))
prediction = &((*prediction)->ep_next);
else
{ {
next = (*prediction)->ep_next; next = (*prediction)->ep_next;
free (*prediction); free (*prediction);
*prediction = next; *prediction = next;
} }
else
prediction = &((*prediction)->ep_next);
} }
} }
} }
/* Filter function predicate that returns true for a edge predicate P
if its edge is equal to DATA. */
bool
equal_edge_p (edge_prediction *p, void *data)
{
return p->ep_edge == (edge)data;
}
/* Remove all predictions on given basic block that are attached
to edge E. */
void
remove_predictions_associated_with_edge (edge e)
{
if (!bb_predictions)
return;
edge_prediction **preds = bb_predictions->get (e->src);
filter_predictions (preds, equal_edge_p, e);
}
/* Clears the list of predictions stored for BB. */ /* Clears the list of predictions stored for BB. */
static void static void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment