4 import java.util.HashSet;
6 import java.util.Iterator;
7 import java.util.Hashtable;
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.*/
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>>>();
16 Set<FlatNode> toprocess=fm.getNodeSet();
18 while(!toprocess.isEmpty()) {
19 FlatNode fn=toprocess.iterator().next();
22 Hashtable<TempDescriptor, Set<FlatNode>> tempset=new Hashtable<TempDescriptor, Set<FlatNode>>();
24 Set<TempDescriptor> livetempset=livemap.get(fn);
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))
34 if (!tempset.containsKey(tmp))
35 tempset.put(tmp, new HashSet<FlatNode>());
36 tempset.get(tmp).addAll(prevtable.get(tmp));
41 TempDescriptor writes[]=fn.writesTemps();
42 for(int i=0;i<writes.length;i++) {
43 HashSet<FlatNode> s=new HashSet<FlatNode>();
45 tempset.put(writes[i],s);
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));