aboutsummaryrefslogtreecommitdiff
path: root/gcc/dominance.c
diff options
context:
space:
mode:
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>2004-03-02 01:28:07 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2004-03-02 00:28:07 +0000
commit738ed9776c49223ef88f6fe43b7fac990f9f2682 (patch)
treedc255ce7f6edeaa13e6ce738680fd87f2356223d /gcc/dominance.c
parent27c102117df46b8f71e9fbfbfdc82406379a06f2 (diff)
downloadgcc-738ed9776c49223ef88f6fe43b7fac990f9f2682.zip
gcc-738ed9776c49223ef88f6fe43b7fac990f9f2682.tar.gz
gcc-738ed9776c49223ef88f6fe43b7fac990f9f2682.tar.bz2
* dominance.c (recount_dominator): Handle postdominators.
From-SVN: r78734
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 d608391..2b6e806 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