* cfghooks.c (split_edge): Speed up updating of dominators.

From-SVN: r77973
This commit is contained in:
Zdenek Dvorak 2004-02-17 20:51:15 +01:00 committed by Jeff Law
parent e70e9b0faa
commit 017b3258fa
2 changed files with 32 additions and 3 deletions

View File

@ -1,3 +1,7 @@
2004-02-17 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* cfghooks.c (split_edge): Speed up updating of dominators.
2004-02-17 Mark Mitchell <mark@codesourcery.com>
PR c++/11326

View File

@ -373,6 +373,7 @@ split_edge (edge e)
basic_block ret;
gcov_type count = e->count;
int freq = EDGE_FREQUENCY (e);
edge f;
if (!cfg_hooks->split_edge)
internal_error ("%s does not support split_edge.", cfg_hooks->name);
@ -387,9 +388,33 @@ split_edge (edge e)
set_immediate_dominator (CDI_DOMINATORS, ret, ret->pred->src);
if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest,
recount_dominator (CDI_DOMINATORS,
ret->succ->dest));
{
/* There are two cases:
If the immediate dominator of e->dest is not e->src, it
remains unchanged.
If immediate dominator of e->dest is e->src, it may become
ret, provided that all other predecessors of e->dest are
dominated by e->dest. */
if (get_immediate_dominator (CDI_DOMINATORS, ret->succ->dest)
== ret->pred->src)
{
for (f = ret->succ->dest->pred; f; f = f->pred_next)
{
if (f == ret->succ)
continue;
if (!dominated_by_p (CDI_DOMINATORS, f->src,
ret->succ->dest))
break;
}
if (!f)
set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest, ret);
}
};
return ret;
}