package ch.usi.inf.sp.dom; import ch.usi.inf.sp.cfg.BasicBlock; import ch.usi.inf.sp.cfg.ControlFlowGraph; import ch.usi.inf.sp.graph.Traversal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DominatorAnalyzer { /** * Cooper et al.'s "Engineered Algorithm". * ================================================================ * for all nodes, b // initialize the dominators array * doms[b] ← Undefined * doms[entryNode] ← entryNode * Changed ← true * while (Changed) * Changed ← false * for all nodes, b, in reverse postorder (except entryNode) * newidom ← first (processed) predecessor of b // (pick one) * for all other predecessors, p, of b * if doms[p] != Undefined // i.e., if doms[p] already calculated * newidom ← intersect(p, newidom) * if doms[b] != newidom * doms[b] ← newidom * Changed ← true * * function intersect(b1, b2) returns node * finger1 ← b1 * finger2 ← b2 * while (finger1 != finger2) * while (finger1 < finger2) * finger1 = doms[finger1] * while (finger2 < finger1) * finger2 = doms[finger2] * return finger1 * ================================================================ * Figure 3 of Cooper, Harvey, Kennedy */ public static DominatorTree analyze(final ControlFlowGraph cfg) { //TODO return null; } // probably add a method intersect(...) }