1 package Analysis.Loops;
3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Vector;
6 import java.util.Stack;
7 import IR.Flat.FlatNode;
10 Hashtable<FlatNode, FlatNode> domtable;
12 Hashtable<FlatNode,Integer> vecindex;
13 Hashtable<FlatNode, Set<FlatNode>> childtree;
15 public DomTree(FlatMethod fm) {
19 public FlatNode idom(FlatNode fn) {
20 return domtable.get(fn);
23 public Set<FlatNode> children(FlatNode fn) {
27 public void analyze(FlatMethod fm) {
29 domtable=new Hashtable<FlatNode, FlatNode>();
31 HashSet<FlatNode> set=new HashSet<FlatNode> ();
33 childtree.put(fm,set);
38 for(int i=vec.size()-2;i>=0;i--) {
39 FlatNode fn=vec.elementAt(i);
41 for(int j=0;j<fn.numPrev();j++) {
42 FlatNode ndom=domtable.get(fn.getPrev(i));
43 dom=intersect(dom,ndom);
45 if (!domtable.containsKey(fn)||
46 !domtable.get(fn).equals(ndom)) {
48 if (!childtree.containsKey(dom))
49 childtree.put(dom, new HashSet<FlatNode>());
50 childtree.get(dom).add(fn);
57 public FlatNode intersect(FlatNode fa, FlatNode fb) {
58 int ifa=vecindex.get(fa).intValue();
59 int ifb=vecindex.get(fb).intValue();
63 ifa=vecindex.get(fa).intValue();
67 ifb=vecindex.get(fb).intValue();
74 public void DFS(FlatMethod fm) {
75 vec=new Vector<FlatNode>();
76 vecindex=new Hashtable<FlatNode,Integer>();
77 HashSet visited=new HashSet();
78 Stack<FlatNode> stack=new Stack<FlatNode>();
82 while(!stack.isEmpty()) {
83 FlatNode fn=stack.peek();
84 for(int i=0;i<fn.numNext();i++) {
85 FlatNode next=fn.getNext(i);
86 if (!visited.contains(next)) {
92 //We're done with this item, return
93 vecindex.put(fn, new Integer(vec.size()));