more analysis flexibility
[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   /* liveintoset if true computes the reaching defs into the node and if false computes the reaching defs out of the node. */
14
15   public static Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> computeReachingDefs(FlatMethod fm, Hashtable<FlatNode, Set<TempDescriptor>> livemap, boolean liveintoset) {
16     Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> nodetotemps=new Hashtable<FlatNode, Hashtable<TempDescriptor,Set<FlatNode>>>();
17
18     Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> liveinto=liveintoset?new Hashtable<FlatNode, Hashtable<TempDescriptor,Set<FlatNode>>>():null;
19     
20     
21     Set<FlatNode> toprocess=fm.getNodeSet();
22     
23     while(!toprocess.isEmpty()) {
24       FlatNode fn=toprocess.iterator().next();
25       toprocess.remove(fn);
26       
27       Hashtable<TempDescriptor, Set<FlatNode>> tempset=new Hashtable<TempDescriptor, Set<FlatNode>>();
28
29       Set<TempDescriptor> livetempset=livemap.get(fn);
30
31       for(int i=0; i<fn.numPrev(); i++) {
32         FlatNode fnprev=fn.getPrev(i);
33         if (nodetotemps.containsKey(fnprev)) {
34           Hashtable<TempDescriptor,Set<FlatNode>> prevtable=nodetotemps.get(fnprev);
35           for(Iterator<TempDescriptor> tmpit=prevtable.keySet().iterator();tmpit.hasNext();) {
36             TempDescriptor tmp=tmpit.next();
37             if (!livetempset.contains(tmp))
38               continue;
39             if (!tempset.containsKey(tmp))
40               tempset.put(tmp, new HashSet<FlatNode>());
41             tempset.get(tmp).addAll(prevtable.get(tmp));
42           }
43         }
44       }
45
46       if (liveintoset) {
47         liveinto.put(fn, new Hashtable<TempDescriptor, Set<FlatNode>>(tempset));
48       }
49       
50       TempDescriptor writes[]=fn.writesTemps();
51       for(int i=0;i<writes.length;i++) {
52         HashSet<FlatNode> s=new HashSet<FlatNode>();
53         s.add(fn);
54         tempset.put(writes[i],s);
55       }
56
57       if (!nodetotemps.containsKey(fn)||
58           !nodetotemps.get(fn).equals(tempset)) {
59         nodetotemps.put(fn, tempset);
60         for(int i=0; i<fn.numNext(); i++)
61           toprocess.add(fn.getNext(i));
62       }
63     }
64     return liveintoset?liveinto:nodetotemps;
65   }
66   
67 }