b72a05a911c915c4cf6545c0e924c619b067c3c3
[IRC.git] / Robust / src / Analysis / Loops / UseDef.java
1 package Analysis.Loops;
2
3 import IR.Flat.*;
4 import java.util.HashSet;
5 import java.util.Hashtable;
6
7 public class UseDef{
8   Hashtable<TempFlatPair, Set<FlatNode>> defs;
9   Hashtable<TempFlatPair, Set<FlatNode>> uses;
10
11   public UseDef(FlatMethod fm) {
12     analyze(fm);
13   }
14
15   public void analyze(FlatMethod fm) {
16     Hashtable<FlatNode, Set<TempFlatPair>> tmp=new Hashtable<FlatNode, Set<TempFlatPair>>();
17     HashSet<FlatNode> toanalyze=new HashSet<FlatNode>();
18     toanalyze.addAll(fm.getNodeSet());
19     while(!toanalyze.isEmpty()) {
20       FlatNode fn=toanalyze.iterator().next();
21       TempDescriptor[] fnwrites=fn.writesTemps();
22
23       toanalyze.remove(fn);
24       HashSet<TempFlatPair> s=new HashSet<TempFlatPair>();
25       for(int i=0;i<fn.numPrev();i++) {
26         FlatNode prev=fn.getPrev(i);
27         HashSet<TempFlatPair> prevs=tmp.get(prev);
28         nexttfp:
29         for(Iterator<TempFlatPair> tfit=prevs.iterator();tfit.hasNext();) {
30           TempFlatPair tfp=tfit.next();
31           for(int j=0;j<fnwrites.length;j++) {
32             if (tfp.t==fnwrites[j])
33               continue nexttfp;
34           }
35           s.add(tfp);
36         }
37         for(int j=0;j<fnwrites.length;j++) {
38           TempFlatPair tfp=new TempFlatPair(fnwrites[j], fn);
39           s.add(tfp);
40         }
41       }
42       if (!tmp.containsKey(fn)||
43           !tmp.get(fn).equals(s)) {
44         tmp.put(fn,s);
45         for(int i=0;i<fn.numNext();i++)
46           toanalyze.put(fn.getNext(i));
47       }
48     }
49     Set<FlatNode> fset=fm.getNodeSet();
50     defs=new Hashtable<TempFlatPair, Set<FlatNode>>();
51     uses=new Hashtable<TempFlatPair, Set<FlatNode>>();
52     for(Iterator<FlatNode> fnit=fset.iterator();fnit.hasNext();) {
53       FlatNode fn=fnit.next();
54       TempDescriptor[] fnreads=fn.readsTemps();
55       Set<TempFlatPair> tfpset=tmp.get(fn);
56       
57       for(int i=0;i<fnreads.length;i++) {
58         TempDescriptor readt=fnreads[i];
59         for(Iterator<TempFlatPair> tfpit=tfpset.iterator();tfpit.hasNext();) {
60           TempFlatPair tfp=tfpit.next();
61           if (tfp.t==readt) {
62             //have use
63             if (!uses.containsKey(tfp))
64               uses.put(tfp,new HashSet<FlatNode>());
65             uses.get(tfp).add(fn);
66             TempFlatPair readtfp=new TempFlatPair(readt,fn);
67             if (!defs.containsKey(readtfp))
68               defs.put(readtfp,new HashSet<FlatNode>());
69             defs.get(readtfp).add(tfp.f);
70           }
71         }
72       }
73     }
74   }
75 }
76
77 class TempFlatPair {
78   FlatNode f;
79   TempDescriptor t;
80   TempFlatPair(TempDescriptor t, FlatNode f) {
81     this.t=t;
82     this.f=f;
83   }
84
85   public int hashCode() {
86     return f.hashCode()^t.hashCode();
87   }
88   public boolean equals(Object o) {
89     TempFlatPair tf=(TempFlatPair)o;
90     return t.equals(tf.t)&&f.equals(tf.f);
91   }
92 }