From: Zdenek Dvorak Date: Tue, 2 Mar 2004 00:28:07 +0000 (+0100) Subject: * dominance.c (recount_dominator): Handle postdominators. X-Git-Tag: releases/gcc-4.0.0~9706 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=738ed9776c49223ef88f6fe43b7fac990f9f2682;p=thirdparty%2Fgcc.git * dominance.c (recount_dominator): Handle postdominators. From-SVN: r78734 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f439fa08990c..3661aa88ce7f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2004-03-02 Zdenek Dvorak + + * dominance.c (recount_dominator): Handle postdominators. + 2004-03-01 Richard Sandiford * config/mips/mips-protos.h (enum mips_symbol_type): Move from mips.h. diff --git a/gcc/dominance.c b/gcc/dominance.c index d608391839df..2b6e806a7776 100644 --- a/gcc/dominance.c +++ b/gcc/dominance.c @@ -769,23 +769,38 @@ verify_dominators (enum cdi_direction dir) abort (); } -/* Recount dominator of BB. */ +/* Determine immediate dominator (or postdominator, according to DIR) of BB, + assuming that dominators of other blocks are correct. We also use it to + recompute the dominators in a restricted area, by iterating it until it + reaches a fixpoint. */ + basic_block recount_dominator (enum cdi_direction dir, basic_block bb) { - basic_block dom_bb = NULL; - edge e; + basic_block dom_bb = NULL; + edge e; if (!dom_computed[dir]) abort (); - for (e = bb->pred; e; e = e->pred_next) - { - if (!dominated_by_p (dir, e->src, bb)) - dom_bb = nearest_common_dominator (dir, dom_bb, e->src); - } + if (dir == CDI_DOMINATORS) + { + for (e = bb->pred; e; e = e->pred_next) + { + if (!dominated_by_p (dir, e->src, bb)) + dom_bb = nearest_common_dominator (dir, dom_bb, e->src); + } + } + else + { + for (e = bb->succ; e; e = e->succ_next) + { + if (!dominated_by_p (dir, e->dest, bb)) + dom_bb = nearest_common_dominator (dir, dom_bb, e->dest); + } + } - return dom_bb; + return dom_bb; } /* Iteratively recount dominators of BBS. The change is supposed to be local