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 /* liveintoset if true computes the reaching defs into the node and if false computes the reaching defs out of the node. */
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>>>();
18 Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> liveinto=liveintoset?new Hashtable<FlatNode, Hashtable<TempDescriptor,Set<FlatNode>>>():null;
21 Set<FlatNode> toprocess=fm.getNodeSet();
23 while(!toprocess.isEmpty()) {
24 FlatNode fn=toprocess.iterator().next();
27 Hashtable<TempDescriptor, Set<FlatNode>> tempset=new Hashtable<TempDescriptor, Set<FlatNode>>();
29 Set<TempDescriptor> livetempset=livemap.get(fn);
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))
39 if (!tempset.containsKey(tmp))
40 tempset.put(tmp, new HashSet<FlatNode>());
41 tempset.get(tmp).addAll(prevtable.get(tmp));
47 liveinto.put(fn, new Hashtable<TempDescriptor, Set<FlatNode>>(tempset));
50 TempDescriptor writes[]=fn.writesTemps();
51 for(int i=0;i<writes.length;i++) {
52 HashSet<FlatNode> s=new HashSet<FlatNode>();
54 tempset.put(writes[i],s);
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));
64 return liveintoset?liveinto:nodetotemps;