Move liveness analysis into its own class
[IRC.git] / Robust / src / Analysis / Liveness.java
1 package Analysis;
2
3 import IR.Flat.*;
4 import java.util.Arrays;
5 import java.util.HashSet;
6 import java.util.Set;
7 import java.util.List;
8 import java.util.Hashtable;
9
10 public class Liveness {
11   /* This methods takes in a FlatMethod and returns a map from a
12    * FlatNode to the set of live temps for that FlatNode.*/
13
14   public static Hashtable<FlatNode, Set<TempDescriptor>> computeLiveTemps(FlatMethod fm) {
15     Hashtable<FlatNode, Set<TempDescriptor>> nodetotemps=new Hashtable<FlatNode, Set<TempDescriptor>>();
16     
17     Set<FlatNode> toprocess=fm.getNodeSet();
18     
19     while(!toprocess.isEmpty()) {
20       FlatNode fn=toprocess.iterator().next();
21       toprocess.remove(fn);
22       
23       List<TempDescriptor> reads=Arrays.asList(fn.readsTemps());
24       List<TempDescriptor> writes=Arrays.asList(fn.writesTemps());
25       
26       HashSet<TempDescriptor> tempset=new HashSet<TempDescriptor>();
27       for(int i=0; i<fn.numNext(); i++) {
28         FlatNode fnnext=fn.getNext(i);
29         if (nodetotemps.containsKey(fnnext))
30           tempset.addAll(nodetotemps.get(fnnext));
31       }
32       tempset.removeAll(writes);
33       tempset.addAll(reads);
34       if (!nodetotemps.containsKey(fn)||
35           !nodetotemps.get(fn).equals(tempset)) {
36         nodetotemps.put(fn, tempset);
37         for(int i=0; i<fn.numPrev(); i++)
38           toprocess.add(fn.getPrev(i));
39       }
40     }
41     return nodetotemps;
42   }
43   
44 }