lots of bug fixes
[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, Hashtable<FlatNode, Set<TempDescriptor>> livemap) {
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       Set<TempDescriptor> livetempset=livemap.get(fn);
25
26       for(int i=0; i<fn.numPrev(); i++) {
27         FlatNode fnprev=fn.getPrev(i);
28         if (nodetotemps.containsKey(fnprev)) {
29           Hashtable<TempDescriptor,Set<FlatNode>> prevtable=nodetotemps.get(fnprev);
30           for(Iterator<TempDescriptor> tmpit=prevtable.keySet().iterator();tmpit.hasNext();) {
31             TempDescriptor tmp=tmpit.next();
32             if (!livetempset.contains(tmp))
33               continue;
34             if (!tempset.containsKey(tmp))
35               tempset.put(tmp, new HashSet<FlatNode>());
36             tempset.get(tmp).addAll(prevtable.get(tmp));
37           }
38         }
39       }
40       
41       TempDescriptor writes[]=fn.writesTemps();
42       for(int i=0;i<writes.length;i++) {
43         HashSet<FlatNode> s=new HashSet<FlatNode>();
44         s.add(fn);
45         tempset.put(writes[i],s);
46       }
47
48       if (!nodetotemps.containsKey(fn)||
49           !nodetotemps.get(fn).equals(tempset)) {
50         nodetotemps.put(fn, tempset);
51         for(int i=0; i<fn.numNext(); i++)
52           toprocess.add(fn.getNext(i));
53       }
54     }
55     return nodetotemps;
56   }
57   
58 }