1 package Analysis.Loops;
4 import java.util.HashSet;
5 import java.util.Hashtable;
7 import java.util.Iterator;
10 Hashtable<TempFlatPair, Set<FlatNode>> defs;
11 Hashtable<TempFlatPair, Set<FlatNode>> uses;
16 public UseDef(FlatMethod fm) {
20 /* Return FlatNodes that define Temp */
21 public Set<FlatNode> defMap(FlatNode fn, TempDescriptor t) {
22 Set<FlatNode> s=defs.get(new TempFlatPair(t,fn));
24 return new HashSet<FlatNode>();
29 /* Return FlatNodes that use Temp */
30 public Set<FlatNode> useMap(FlatNode fn, TempDescriptor t) {
31 Set<FlatNode> s=uses.get(new TempFlatPair(t,fn));
33 return new HashSet<FlatNode>();
38 public void analyze(FlatMethod fm) {
39 Hashtable<FlatNode, Set<TempFlatPair>> tmp=new Hashtable<FlatNode, Set<TempFlatPair>>();
40 HashSet<FlatNode> toanalyze=new HashSet<FlatNode>();
41 toanalyze.addAll(fm.getNodeSet());
42 while(!toanalyze.isEmpty()) {
43 FlatNode fn=toanalyze.iterator().next();
44 TempDescriptor[] fnwrites=fn.writesTemps();
47 HashSet<TempFlatPair> s=new HashSet<TempFlatPair>();
48 for(int i=0;i<fn.numPrev();i++) {
49 FlatNode prev=fn.getPrev(i);
50 Set<TempFlatPair> prevs=tmp.get(prev);
53 for(Iterator<TempFlatPair> tfit=prevs.iterator();tfit.hasNext();) {
54 TempFlatPair tfp=tfit.next();
55 for(int j=0;j<fnwrites.length;j++) {
56 if (tfp.t==fnwrites[j])
62 for(int j=0;j<fnwrites.length;j++) {
63 TempFlatPair tfp=new TempFlatPair(fnwrites[j], fn);
67 if (!tmp.containsKey(fn)||
68 !tmp.get(fn).equals(s)) {
70 for(int i=0;i<fn.numNext();i++)
71 toanalyze.add(fn.getNext(i));
74 Set<FlatNode> fset=fm.getNodeSet();
75 defs=new Hashtable<TempFlatPair, Set<FlatNode>>();
76 uses=new Hashtable<TempFlatPair, Set<FlatNode>>();
77 for(Iterator<FlatNode> fnit=fset.iterator();fnit.hasNext();) {
78 FlatNode fn=fnit.next();
79 TempDescriptor[] fnreads=fn.readsTemps();
80 Set<TempFlatPair> tfpset=tmp.get(fn);
82 for(int i=0;i<fnreads.length;i++) {
83 TempDescriptor readt=fnreads[i];
84 for(Iterator<TempFlatPair> tfpit=tfpset.iterator();tfpit.hasNext();) {
85 TempFlatPair tfp=tfpit.next();
88 if (!uses.containsKey(tfp))
89 uses.put(tfp,new HashSet<FlatNode>());
90 uses.get(tfp).add(fn);
91 TempFlatPair readtfp=new TempFlatPair(readt,fn);
92 if (!defs.containsKey(readtfp))
93 defs.put(readtfp,new HashSet<FlatNode>());
94 defs.get(readtfp).add(tfp.f);
105 TempFlatPair(TempDescriptor t, FlatNode f) {
110 public int hashCode() {
111 return f.hashCode()^t.hashCode();
113 public boolean equals(Object o) {
114 TempFlatPair tf=(TempFlatPair)o;
115 return t.equals(tf.t)&&f.equals(tf.f);