diff options
author | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-02 00:28:07 +0000 |
---|---|---|
committer | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-02 00:28:07 +0000 |
commit | 3745d6a0e9b71a6a5895881cd04203a5ab737028 (patch) | |
tree | dc255ce7f6edeaa13e6ce738680fd87f2356223d /gcc/dominance.c | |
parent | 9465970f757c9d0ca0c37c044ad2803a8113be7a (diff) | |
download | gcc-3745d6a0e9b71a6a5895881cd04203a5ab737028.tar.gz |
* dominance.c (recount_dominator): Handle postdominators.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78734 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dominance.c')
-rw-r--r-- | gcc/dominance.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/gcc/dominance.c b/gcc/dominance.c index d608391839d..2b6e806a777 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 |