summaryrefslogtreecommitdiff
path: root/gcc/dominance.c
diff options
context:
space:
mode:
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-02 00:28:07 +0000
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-02 00:28:07 +0000
commit3745d6a0e9b71a6a5895881cd04203a5ab737028 (patch)
treedc255ce7f6edeaa13e6ce738680fd87f2356223d /gcc/dominance.c
parent9465970f757c9d0ca0c37c044ad2803a8113be7a (diff)
downloadgcc-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.c33
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