* cfghooks.c (split_edge): Speed up updating of dominators.
From-SVN: r77973
This commit is contained in:
parent
e70e9b0faa
commit
017b3258fa
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue