dominance.c: Add comment about why we use DFS numbering of dominance tree.
2006-01-03 Daniel Berlin <dberlin@dberlin.org> * dominance.c: Add comment about why we use DFS numbering of dominance tree. From-SVN: r109308
This commit is contained in:
parent
862e1e62fc
commit
b629276a48
@ -1,3 +1,8 @@
|
||||
2006-01-03 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* dominance.c: Add comment about why we use DFS numbering
|
||||
of dominance tree.
|
||||
|
||||
2006-01-03 Jakub Jelinek <jakub@redhat.com>
|
||||
Richard Henderson <rth@redhat.com>
|
||||
|
||||
|
@ -814,6 +814,80 @@ nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
|
||||
return dom;
|
||||
}
|
||||
|
||||
/* Given a dominator tree, we can determine whether one thing
|
||||
dominates another in constant time by using two DFS numbers:
|
||||
|
||||
1. The number for when we visit a node on the way down the tree
|
||||
2. The number for when we visit a node on the way back up the tree
|
||||
|
||||
You can view these as bounds for the range of dfs numbers the
|
||||
nodes in the subtree of the dominator tree rooted at that node
|
||||
will contain.
|
||||
|
||||
The dominator tree is always a simple acyclic tree, so there are
|
||||
only three possible relations two nodes in the dominator tree have
|
||||
to each other:
|
||||
|
||||
1. Node A is above Node B (and thus, Node A dominates node B)
|
||||
|
||||
A
|
||||
|
|
||||
C
|
||||
/ \
|
||||
B D
|
||||
|
||||
|
||||
In the above case, DFS_Number_In of A will be <= DFS_Number_In of
|
||||
B, and DFS_Number_Out of A will be >= DFS_Number_Out of B. This is
|
||||
because we must hit A in the dominator tree *before* B on the walk
|
||||
down, and we will hit A *after* B on the walk back up
|
||||
|
||||
2. Node A is below node B (and thus, node B dominates node B)
|
||||
|
||||
|
||||
B
|
||||
|
|
||||
A
|
||||
/ \
|
||||
C D
|
||||
|
||||
In the above case, DFS_Number_In of A will be >= DFS_Number_In of
|
||||
B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
|
||||
|
||||
This is because we must hit A in the dominator tree *after* B on
|
||||
the walk down, and we will hit A *before* B on the walk back up
|
||||
|
||||
3. Node A and B are siblings (and thus, neither dominates the other)
|
||||
|
||||
C
|
||||
|
|
||||
D
|
||||
/ \
|
||||
A B
|
||||
|
||||
In the above case, DFS_Number_In of A will *always* be <=
|
||||
DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
|
||||
DFS_Number_Out of B. This is because we will always finish the dfs
|
||||
walk of one of the subtrees before the other, and thus, the dfs
|
||||
numbers for one subtree can't intersect with the range of dfs
|
||||
numbers for the other subtree. If you swap A and B's position in
|
||||
the dominator tree, the comparison changes direction, but the point
|
||||
is that both comparisons will always go the same way if there is no
|
||||
dominance relationship.
|
||||
|
||||
Thus, it is sufficient to write
|
||||
|
||||
A_Dominates_B (node A, node B)
|
||||
{
|
||||
return DFS_Number_In(A) <= DFS_Number_In(B)
|
||||
&& DFS_Number_Out (A) >= DFS_Number_Out(B);
|
||||
}
|
||||
|
||||
A_Dominated_by_B (node A, node B)
|
||||
{
|
||||
return DFS_Number_In(A) >= DFS_Number_In(A)
|
||||
&& DFS_Number_Out (A) <= DFS_Number_Out(B);
|
||||
} */
|
||||
|
||||
/* Return TRUE in case BB1 is dominated by BB2. */
|
||||
bool
|
||||
|
Loading…
Reference in New Issue
Block a user