47 jd->ld->root->successorcount = 1;
53 jd->ld->root->successorcount++;
57 jd->ld->root->successors =
new basicblock*[jd->ld->root->successorcount];
82 jd->ld->vertex.push_back(0);
84 assert(jd->ld->vertex.size() == 1);
96 assert(static_cast<s4>(jd->ld->vertex.size()) == jd->ld->n + 1);
97 for (
s4 i = jd->ld->n;
i >= 2;
i--)
105 typedef std::vector<basicblock*>::iterator Iterator;
107 for (Iterator it = w->ld->pred.begin(); it != w->ld->pred.end(); ++it)
112 if (u->ld->semi < w->ld->semi)
113 w->ld->semi = u->ld->semi;
116 jd->ld->vertex[w->ld->semi]->ld->bucket.push_back(w);
117 link(w->ld->parent, w);
123 std::vector<basicblock*>& bucket = w->ld->parent->ld->bucket;
124 for (Iterator it = bucket.begin(); it != bucket.end(); ++it)
129 if (u->ld->semi < v->ld->semi)
132 v->ld->dom = w->ld->parent;
141 for (
s4 i = 2;
i <= jd->ld->n;
i++)
145 if (w->ld->dom != jd->ld->vertex[w->ld->semi])
146 w->ld->dom = w->ld->dom->ld->dom;
148 jd->ld->root->ld->dom = 0;
153 block->ld->semi = ++jd->ld->n;
154 jd->ld->vertex.push_back(block);
155 block->ld->label =
block;
158 assert(static_cast<s4>(jd->ld->vertex.size()) == jd->ld->n + 1);
164 if (successor->ld->semi == 0)
166 successor->ld->parent =
block;
171 jd->ld->depthBackEdges.push_back(
Edge(block, successor));
174 successor->ld->pred.push_back(block);
190 if (block->ld->ancestor == 0)
197 return block->ld->label;
205 assert(ancestor != 0);
207 if (ancestor->ld->ancestor != 0)
210 if (ancestor->ld->label->ld->semi < block->ld->label->ld->semi)
212 block->ld->label = ancestor->ld->label;
214 block->ld->ancestor = ancestor->ld->ancestor;
227 std::vector<basicblock*>& children =
block->ld->dom->ld->children;
230 if (!children.empty())
231 children.back()->ld->nextSibling =
block;
233 children.push_back(
block);
basicblock * eval(basicblock *)
void printBasicBlocks(jitdata *)
void createRoot(jitdata *jd)
void link(basicblock *v, basicblock *w)
void compress(basicblock *)
void buildDominatorTree(jitdata *jd)
Uses the immediate dominators to build a dominator tree which can be traversed from the root to the l...
struct BasicblockLoopData BasicblockLoopData
void depthFirstTraversal(jitdata *jd, basicblock *block)
void calculateDominators(jitdata *jd)
Calculates the immediate dominators of all basicblocks.