{
int lastSemiNumber = semi.size() - 1;
for (int i = lastSemiNumber; i > 0; i--)
{
IBasicBlock w = vertex.get(i);
IBasicBlock p = this.parent.get(w);
// step 2: compute semidominators
// for each v in pred(w)...
int semidominator = semi.get(w);
for (IBasicBlock v : pred.get(w))
semidominator = Math.min(semidominator, semi.get(eval(v)));
semi.put(w, semidominator);
bucket.get(vertex.get(semidominator)).add(w);
// Link w into the forest via its parent, p
link(p, w);
// step 3: implicitly compute idominators
// for each v in bucket(parent(w)) ...
for (IBasicBlock v : bucket.get(p))
{
IBasicBlock u = eval(v);
if (semi.get(u) < semi.get(v))
idom.put(v, u);
else
idom.put(v, p);
}
bucket.get(p).clear();
}
// step 4: explicitly compute idominators
for (int i = 1; i <= lastSemiNumber; i++)
{
IBasicBlock w = vertex.get(i);
if (idom.get(w) != vertex.get((semi.get(w))))
idom.put(w, idom.get(idom.get(w)));
}
}