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) {
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 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));
37 TempDescriptor writes[]=fn.writesTemps();
38 for(int i=0;i<writes.length;i++) {
39 HashSet<FlatNode> s=new HashSet<FlatNode>();
41 tempset.put(writes[i],s);
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));