53 lines
1.6 KiB
Java
53 lines
1.6 KiB
Java
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(...)
|
|
|
|
}
|