From: Zdenek Dvorak Date: Tue, 17 Feb 2004 19:51:15 +0000 (+0100) Subject: * cfghooks.c (split_edge): Speed up updating of dominators. X-Git-Tag: releases/gcc-4.0.0~10064 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=017b3258fa075ff64facea88e200ee6b88bcd602;p=thirdparty%2Fgcc.git * cfghooks.c (split_edge): Speed up updating of dominators. From-SVN: r77973 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c099df62beb2..33c57331d0fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2004-02-17 Zdenek Dvorak + + * cfghooks.c (split_edge): Speed up updating of dominators. + 2004-02-17 Mark Mitchell PR c++/11326 diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index ab4718160cdd..e25612424d70 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -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; }