Skip to content
Extraits de code Groupes Projets
Valider fe1f21cc rédigé par Nicolas MARIE's avatar Nicolas MARIE
Parcourir les fichiers

refactor dominance frontier compute

parent 3747714d
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -59,8 +59,7 @@ public:
// calculate dominances
void label_dom(function *fun);
void compute_dominance_frontiers(function *fun);
void compute_post_dominance_frontiers(function *fun);
void label_dom_front(function *fun);
void free_dom_data();
private:
......
......@@ -59,8 +59,7 @@ unsigned int pass_mpi_collective::execute(function *fun)
alloc_bb_aux(fun);
label_collec(fun);
label_dom(fun);
compute_dominance_frontiers(fun);
compute_post_dominance_frontiers(fun);
label_dom_front(fun);
cfgviz_dump(fun, "_split");
free_dom_data();
......@@ -274,71 +273,71 @@ void pass_mpi_collective::label_dom(function *fun)
}
}
void pass_mpi_collective::compute_dominance_frontiers(function *fun)
void pass_mpi_collective::label_dom_front(function *fun)
{
edge p;
edge_iterator ei;
basic_block b;
basic_block bb;
basic_block dom_bb;
basic_block runner;
bb_data *data;
FOR_EACH_BB_FN(b, fun)
FOR_EACH_BB_FN(bb, fun)
{
if (EDGE_COUNT(b->preds) >= 2)
if (EDGE_COUNT(bb->preds) < 2)
{
basic_block domsb = get_immediate_dominator(CDI_DOMINATORS, b);
FOR_EACH_EDGE(p, ei, b->preds)
continue;
}
dom_bb = get_immediate_dominator(CDI_DOMINATORS, bb);
FOR_EACH_EDGE(p, ei, bb->preds)
{
basic_block runner = p->src;
runner = p->src;
if (runner == ENTRY_BLOCK_PTR_FOR_FN(fun))
{
continue;
}
while (runner != domsb)
while (runner != dom_bb)
{
bb_data *data = (bb_data *) runner->aux;
if (data->dom_front.count(b) > 0)
data = (bb_data *) runner->aux;
if (data->dom_front.count(bb) > 0)
{
break;
}
data->dom_front.insert(b);
data->dom_front.insert(bb);
runner = get_immediate_dominator(CDI_DOMINATORS, runner);
}
}
}
}
}
void pass_mpi_collective::compute_post_dominance_frontiers(function *fun)
{
edge p;
edge_iterator ei;
basic_block b;
FOR_EACH_BB_FN(b, fun)
FOR_EACH_BB_FN(bb, fun)
{
if (EDGE_COUNT(b->succs) >= 2)
if (EDGE_COUNT(bb->succs) < 2)
{
basic_block domsb = get_immediate_dominator(CDI_POST_DOMINATORS, b);
FOR_EACH_EDGE(p, ei, b->succs)
continue;
}
dom_bb = get_immediate_dominator(CDI_POST_DOMINATORS, bb);
FOR_EACH_EDGE(p, ei, bb->succs)
{
basic_block runner = p->dest;
runner = p->dest;
if (runner == EXIT_BLOCK_PTR_FOR_FN(fun))
{
continue;
}
while (runner != domsb)
while (runner != dom_bb)
{
bb_data *data = (bb_data *) runner->aux;
if (data->post_dom_front.count(b) > 0)
data = (bb_data *) runner->aux;
if (data->post_dom_front.count(bb) > 0)
{
break;
}
data->post_dom_front.insert(b);
data->post_dom_front.insert(bb);
runner = get_immediate_dominator(CDI_POST_DOMINATORS, runner);
}
}
}
}
}
void pass_mpi_collective::free_dom_data()
{
......@@ -451,8 +450,7 @@ void pass_mpi_collective::cfgviz_internal_dump(function *fun, FILE *out)
fprintf(out, "}\n");
}
void pass_mpi_collective::cfgviz_dump(function *fun,
const char *suffix)
void pass_mpi_collective::cfgviz_dump(function *fun, const char *suffix)
{
char *target_filename;
FILE *out;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter