check in reaching defs analysis
[IRC.git] / Robust / src / Analysis / ReachingDefs.java
1 package Analysis;
2
3 import IR.Flat.*;
4 import java.util.HashSet;
5 import java.util.Set;
6 import java.util.Iterator;
7 import java.util.Hashtable;
8
9 public class ReachingDefs {
10   /* This methods takes in a FlatMethod and returns a map from a
11    * FlatNode to the set of live temps for that FlatNode.*/
12
13   public static Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> computeReachingDefs(FlatMethod fm) {
14     Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> nodetotemps=new Hashtable<FlatNode, Hashtable<TempDescriptor,Set<FlatNode>>>();
15     
16     Set<FlatNode> toprocess=fm.getNodeSet();
17     
18     while(!toprocess.isEmpty()) {
19       FlatNode fn=toprocess.iterator().next();
20       toprocess.remove(fn);
21       
22       Hashtable<TempDescriptor, Set<FlatNode>> tempset=new Hashtable<TempDescriptor, Set<FlatNode>>();
23
24       for(int i=0; i<fn.numPrev(); i++) {
25         FlatNode fnprev=fn.getPrev(i);
26         if (nodetotemps.containsKey(fnprev)) {
27           Hashtable<TempDescriptor,Set<FlatNode>> prevtable=nodetotemps.get(fnprev);
28           for(Iterator<TempDescriptor> tmpit=prevtable.keySet().iterator();tmpit.hasNext();) {
29             TempDescriptor tmp=tmpit.next();
30             if (!tempset.containsKey(tmp))
31               tempset.put(tmp, new HashSet<FlatNode>());
32             tempset.get(tmp).addAll(prevtable.get(tmp));
33           }
34         }
35       }
36       
37       TempDescriptor writes[]=fn.writesTemps();
38       for(int i=0;i<writes.length;i++) {
39         HashSet<FlatNode> s=new HashSet<FlatNode>();
40         s.add(fn);
41         tempset.put(writes[i],s);
42       }
43
44       if (!nodetotemps.containsKey(fn)||
45           !nodetotemps.get(fn).equals(tempset)) {
46         nodetotemps.put(fn, tempset);
47         for(int i=0; i<fn.numNext(); i++)
48           toprocess.add(fn.getNext(i));
49       }
50     }
51     return nodetotemps;
52   }
53   
54 }