basicblockLocation Class Reference#include <location.h>
Inheritance diagram for basicblockLocation:
List of all members.
Member Enumeration Documentation
|
Kind of location.
- Enumeration values:
-
Statement |
|
BasicBlock |
|
Procedure |
|
Definition at line 93 of file location.h. |
Constructor & Destructor Documentation
virtual basicblockLocation::~basicblockLocation |
( |
|
) |
[virtual] |
|
Member Function Documentation
virtual void basicblockLocation::adjust_depth |
( |
|
) |
[virtual] |
|
|
Adjust tree depths.
Implements Location. |
void Location::clear_dominator |
( |
|
) |
[inherited] |
|
void Location::decrement_children |
( |
|
) |
[inline, inherited] |
|
static bool Location::dominates |
( |
const Location * |
dom, |
|
|
const Location * |
cur |
|
) |
[static, inherited] |
|
|
Interprocedure dominance test.
|
Location* Location::dominator |
( |
|
) |
const [inline, inherited] |
|
void Location::finish |
( |
|
) |
[inherited] |
|
|
Finish.
Assign the post-order "tree max" (up the tree) number for a location. We call this method only when we find a location that doesn't dominate anything, and is therefore a leaf in the dominator tree. We move up the tree assigning tree max values until we find a sibling that has not been numbered yet. This siutation is indicated by a parent with num_children != 0. |
void Location::increment_children |
( |
|
) |
[inline, inherited] |
|
static bool Location::is_prefix |
( |
const Location * |
prefix, |
|
|
const Location * |
longer |
|
) |
[static, inherited] |
|
|
See if one location is a prefix of the other.
|
static unsigned int Location::next_tree_number |
( |
|
) |
[inline, static, protected, inherited] |
|
int Location::num_children |
( |
|
) |
const [inline, inherited] |
|
Location* Location::parent |
( |
|
) |
const [inline, inherited] |
|
virtual void basicblockLocation::print |
( |
ostream & |
o |
) |
const [virtual] |
|
virtual void basicblockLocation::print_path |
( |
ostream & |
o |
) |
const [virtual] |
|
procLocation* basicblockLocation::proc_location |
( |
|
) |
const [inline] |
|
|
Find the enclosing procedure.
|
void Location::set_dominator |
( |
Location * |
d |
) |
[inherited] |
|
void Location::set_tree_max |
( |
unsigned int |
m |
) |
[inline, inherited] |
|
void Location::set_tree_min |
( |
unsigned int |
m |
) |
[inline, inherited] |
|
static void Location::stats |
( |
|
) |
[static, inherited] |
|
static bool Location::strictly_dominates |
( |
const Location * |
dom, |
|
|
const Location * |
cur |
|
) |
[static, inherited] |
|
|
Interprocedure strict dominance test.
|
unsigned int Location::subtree_id |
( |
|
) |
const [inline, inherited] |
|
unsigned int Location::tree_max |
( |
|
) |
const [inline, inherited] |
|
unsigned int Location::tree_min |
( |
|
) |
const [inline, inherited] |
|
void Location::visit |
( |
|
) |
[inherited] |
|
|
Visit.
Assign the pre-order "tree min" (down the tree) number for a location. We call this method as we encounter each location during analysis. |
Friends And Related Function Documentation
ostream& operator<< |
( |
ostream & |
o, |
|
|
const Location & |
loc |
|
) |
[friend, inherited] |
|
Member Data Documentation
|
Immediate dominator.
This points to the immediate dominator of this node. It is set up during the construction of the location tree. It embodies the dominance rules discussed above.
Definition at line 178 of file location.h.
Referenced by Location::dominator(). |
|
The kind of location.
There are only three kinds, so we only need two bits.
Definition at line 129 of file location.h.
Referenced by Location::kind(). |
|
Number of dominator children.
This is the number of locations immediately dominated by this one. We use this number to control the depth-first tree numbering algorithm. When the number is greater than one, we know that we still have dominator subtrees to number. Each time we finish a subtree, we decrement this number on the immediate dominator. When it reaches zero, the whole subtree is numbered.
We limit this field to 8 bits, which only allows a node to immediately dominate 256 other nodes. This is probably way higher than it needs to be, but we'll play it safe.
Definition at line 170 of file location.h.
Referenced by Location::decrement_children(), Location::increment_children(), and Location::num_children(). |
|
Subtree ID.
This number is used for context-insensitive analysis to quickly determine whether two locations can have a dominance relationship. Each context-sensitive program region has a unique subtree ID. If two locations have difference subtree IDs, then they are incomparable, and therefore cannot have a dominance relationship.
We arbitrarily choose 16 bits for this field, which would effectively limit the analyzer to 32K procedures (but that seems reasonable).
Definition at line 151 of file location.h.
Referenced by Location::subtree_id(). |
|
Tree numbering
These two numbers implement the tree numbering scheme (from communication from Mark Wegman) that allows a constant time interprocedural dominance test. The scheme works as follows: we perform a depth-first traversal of the dominator tree, both pre-order and post-order, assigning consecutive numbers to "tree min" value on the way down, and the "tree max" value on the way up.
This numbering results in the following invariant: the min-max range of each node contains the min-max ranges of all nodes that it dominates.
Since we compute this numbering on-line, we need to test dominance for nodes on the way down the tree. This means we have to do without a tree max value in some cases. Therefore, we have a special case: the tree max defaults to MAX_INT until it is given a specific value.
These number can get large, so we use full 32-bit ints (limits us to 4 billion program locations).
Definition at line 203 of file location.h.
Referenced by Location::set_tree_min(), and Location::tree_min(). |
|
Global subtree ID counter.
Definition at line 155 of file location.h. |
|
Some global counters.
Definition at line 98 of file location.h. |
The documentation for this class was generated from the following file:
|