44 # define DOM_DEBUG_VERBOSE
47 #ifdef DOM_DEBUG_CHECK
48 # define _DOM_CHECK_BOUNDS(i,l,h) assert( ((i) >= (l)) && ((i) < (h)));
49 # define _DOM_ASSERT(a) assert((a));
51 # define _DOM_CHECK_BOUNDS(i,l,h)
52 # define _DOM_ASSERT(a)
57 #ifdef DOM_DEBUG_CHECK
72 int i,j,n,
N,p,s,s_,v,y;
85 #ifdef DOM_DEBUG_CHECK
90 for(i = N-1; i > 0; i--) {
103 #ifdef DOM_DEBUG_CHECK
117 #ifdef DOM_DEBUG_CHECK
126 #ifdef DOM_DEBUG_CHECK
139 for(i = 1; i <
N; i++) {
159 for(i = 0; i < basicblockcount; i++)
164 if (dd->
idom[i] != n)
167 for(c=0; c < basicblockcount; c++) {
168 if (dd->
idom[c] == n) {
170 for(j=0; j < dd->
num_DF[c]; j++) {
172 if (n != dd->
idom[dd->
DF[c][j]])
174 _S[dd->
DF[c][j]] =
true;
178 for(i = 0; i < basicblockcount; i++)
202 for (i=0; i < basicblockcount; i++) {
215 #ifdef DOM_DEBUG_CHECK
217 int basicblockcount) {
225 if (dd->
dfnum[n] == -1) {
234 #ifdef DOM_DEBUG_CHECK
242 #ifdef DOM_DEBUG_CHECK
254 #ifdef DOM_DEBUG_CHECK
268 #ifdef DOM_DEBUG_CHECK
343 if (node->
dfnum == -1) {
417 node->
semi = semicand;
446 node->
idom->
bb->domsuccessorcount += 1;
453 unsigned *numsuccessors;
461 if (bb->domsuccessorcount > 0) {
475 bb->idom->domsuccessors[numsuccessors[bb->idom->
nr]] = bb;
476 numsuccessors[bb->idom->
nr] += 1;
509 for (item = list->
first; item; item = item->
next) {
510 if (item->
bb == bb)
return;
557 if ((*it)->idom != b) {
562 for (it = b->domsuccessors; it != b->domsuccessors + b->domsuccessorcount; ++it) {
564 for (itdf = dfi->
map[(*it)->nr].
first; itdf; itdf = itdf->
next) {
582 bb->domfrontiercount = dfi->
map[bb->
nr].
count;
626 if (bptr->idom == NULL) {
627 if (!(dd->
idom[bptr->
nr] == -1)) {
632 assert(dd->
idom[bptr->
nr] == bptr->idom->
nr);
641 assert(bptr->domfrontiercount == dd->
num_DF[bptr->
nr]);
642 for (itnr = dd->
DF[bptr->
nr]; itnr != dd->
DF[bptr->
nr] + dd->
num_DF[bptr->
nr]; ++itnr) {
644 for (it = bptr->domfrontier; it != bptr->domfrontier + bptr->domfrontiercount; ++it) {
645 if ((*it)->nr == *itnr) {
void dom_DFS(graphdata *gd, dominatordata *dd, int p, int n, int *N)
int graph_get_next(graphiterator *i)
bool dominance_frontier_dominates(basicblock *d, basicblock *x)
void dominator_tree_link_children(jitdata *jd)
basicblock_info ** bucket
dominance_frontier_item * first
void dominator_tree_build_intern(jitdata *jd)
void computeDF(graphdata *gd, dominatordata *dd, int basicblockcount, int n)
void graph_add_edge(graphdata *gd, int from, int to)
void dominator_tree_link(dominator_tree_info *di, basicblock_info *parent, basicblock_info *node)
void dominator_tree_validate(jitdata *jd, dominatordata *_dd)
int dom_AncestorWithLowestSemi(dominatordata *dd, int v)
int graph_get_first_predecessor(graphdata *gd, int b_index, graphiterator *i)
dominance_frontier_list * map
basicblock_info * samedom
dominance_frontier_item * next
#define MZERO(ptr, type, num)
void dom_Link(dominatordata *dd, int p, int n)
#define _DOM_CHECK_BOUNDS(i, l, h)
void dominance_frontier_list_add(dominance_frontier_list *list, basicblock *bb)
void dominance_frontier_store(dominance_frontier_info *dfi)
void dom_Dominators_init(dominatordata *dd, int basicblockcount)
basicblock ** predecessors
basicblock_info ** df_map
bool dominance_frontier_build(jitdata *jd)
basicblock_info * ancestor
bool dominator_tree_build(jitdata *jd)
byte_iterator begin() const
static basicblock_info * dominator_tree_get_basicblock(dominator_tree_info *di, basicblock *bb)
static void * allocate(size_t size)
dominatordata * compute_Dominators(graphdata *gd, int basicblockcount)
dominance_frontier_info * dominance_frontier_init(jitdata *jd)
basicblock_info * dominator_tree_ancestor_with_lowest_semi(dominator_tree_info *di, basicblock_info *node)
basicblock_info * basicblocks
static void dominator_tree_depth_first_search(dominator_tree_info *di, basicblock_info *parent, basicblock_info *node)
static dominator_tree_info * dominator_tree_init(jitdata *jd)
void dominance_frontier_for_block(dominance_frontier_info *dfi, basicblock *b)
graphdata * graph_init(int basicblockcount)
int graph_get_first_successor(graphdata *gd, int b_index, graphiterator *i)