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
This commit is contained in:
parent
7d82e8e465
commit
28cd6814b5
|
@ -1,3 +1,10 @@
|
||||||
|
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,6 +609,44 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Filter edge predictions PREDS by a function FILTER. DATA are passed
|
||||||
|
to the filter function. */
|
||||||
|
|
||||||
|
void
|
||||||
|
filter_predictions (edge_prediction **preds,
|
||||||
|
bool (*filter) (edge_prediction *, void *), void *data)
|
||||||
|
{
|
||||||
|
if (!bb_predictions)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (preds)
|
||||||
|
{
|
||||||
|
struct edge_prediction **prediction = preds;
|
||||||
|
struct edge_prediction *next;
|
||||||
|
|
||||||
|
while (*prediction)
|
||||||
|
{
|
||||||
|
if ((*filter) (*prediction, data))
|
||||||
|
prediction = &((*prediction)->ep_next);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
next = (*prediction)->ep_next;
|
||||||
|
free (*prediction);
|
||||||
|
*prediction = 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
|
/* Remove all predictions on given basic block that are attached
|
||||||
to edge E. */
|
to edge E. */
|
||||||
void
|
void
|
||||||
|
@ -618,24 +656,7 @@ remove_predictions_associated_with_edge (edge e)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
edge_prediction **preds = bb_predictions->get (e->src);
|
edge_prediction **preds = bb_predictions->get (e->src);
|
||||||
|
filter_predictions (preds, equal_edge_p, e);
|
||||||
if (preds)
|
|
||||||
{
|
|
||||||
struct edge_prediction **prediction = preds;
|
|
||||||
struct edge_prediction *next;
|
|
||||||
|
|
||||||
while (*prediction)
|
|
||||||
{
|
|
||||||
if ((*prediction)->ep_edge == e)
|
|
||||||
{
|
|
||||||
next = (*prediction)->ep_next;
|
|
||||||
free (*prediction);
|
|
||||||
*prediction = next;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
prediction = &((*prediction)->ep_next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clears the list of predictions stored for BB. */
|
/* Clears the list of predictions stored for BB. */
|
||||||
|
|
Loading…
Reference in New Issue