1 package Analysis.Locality;
2 import Analysis.Liveness;
3 import Analysis.ReachingDefs;
4 import Analysis.Loops.DomTree;
6 import IR.MethodDescriptor;
7 import IR.TypeDescriptor;
8 import IR.FieldDescriptor;
10 import Analysis.Loops.GlobalFieldType;
11 import java.util.HashSet;
12 import java.util.Hashtable;
14 import java.util.List;
15 import java.util.Arrays;
16 import java.util.Stack;
17 import java.util.Iterator;
19 public class DCWrapper {
20 DelayComputation delaycomp;
22 LocalityAnalysis locality;
23 TypeAnalysis typeanalysis;
26 public DCWrapper(LocalityAnalysis locality, State state, TypeAnalysis typeanalysis, GlobalFieldType gft) {
27 delaycomp=new DelayComputation(locality, state, typeanalysis, gft);
28 delaycomp.doAnalysis();
30 this.locality=locality;
31 this.typeanalysis=typeanalysis;
33 Set<LocalityBinding> localityset=locality.getLocalityBindings();
34 for(Iterator<LocalityBinding> lbit=localityset.iterator();lbit.hasNext();) {
35 processlb(lbit.next());
39 Hashtable<LocalityBinding, Set<FlatNode>> transmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
40 Hashtable<LocalityBinding, Set<FlatNode>> recordmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
41 Hashtable<LocalityBinding, Set<FlatNode>> othermap=new Hashtable<LocalityBinding, Set<FlatNode>>();
42 Hashtable<LocalityBinding, Set<FlatNode>> notreadymap=new Hashtable<LocalityBinding, Set<FlatNode>>();
43 Hashtable<LocalityBinding, HashSet<FlatNode>> cannotdelaymap=new Hashtable<LocalityBinding, HashSet<FlatNode>>();
44 Hashtable<LocalityBinding, Set<FlatNode>> derefmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
46 public DiscoverConflicts getConflicts() {
47 DiscoverConflicts dc=new DiscoverConflicts(locality, state, typeanalysis, cannotdelaymap, false, false, state.READSET?gft:null);
52 public Hashtable<LocalityBinding, HashSet<FlatNode>> getCannotDelayMap() {
53 return cannotdelaymap;
56 public boolean needsFission(LocalityBinding lb, FlatAtomicEnterNode faen) {
57 return transmap.get(lb).contains(faen);
60 public Set<TempDescriptor> liveinto(LocalityBinding lb, FlatAtomicEnterNode faen, Set<FlatNode> recordset) {
61 return delaycomp.liveinto(lb, faen, recordset);
64 public Set<TempDescriptor> alltemps(LocalityBinding lb, FlatAtomicEnterNode faen, Set<FlatNode> recordset) {
65 return delaycomp.alltemps(lb, faen, recordset);
68 public Set<TempDescriptor> liveout(LocalityBinding lb, FlatAtomicEnterNode faen) {
69 return delaycomp.liveout(lb, faen);
72 public Set<TempDescriptor> liveoutvirtualread(LocalityBinding lb, FlatAtomicEnterNode faen) {
73 return delaycomp.liveoutvirtualread(lb, faen);
76 private static HashSet<FlatNode> intersect(Set<FlatNode> a, Set<FlatNode> b) {
77 HashSet<FlatNode> intersect=new HashSet(b);
78 intersect.retainAll(a);
82 public Set<FlatNode> getDeref(LocalityBinding lb) {
83 return derefmap.get(lb);
86 public Set<FlatNode> getNotReady(LocalityBinding lb) {
87 return notreadymap.get(lb);
90 public Set<FlatNode> getCannotDelay(LocalityBinding lb) {
91 return cannotdelaymap.get(lb);
94 public Set<FlatNode> getOther(LocalityBinding lb) {
95 return othermap.get(lb);
98 public Set<FlatNode> livecode(LocalityBinding lb) {
99 return recordmap.get(lb);
102 private void processlb(LocalityBinding lb) {
103 transmap.put(lb, new HashSet<FlatNode>());
104 if (lb.isAtomic()||!lb.getHasAtomic())
107 Set<FlatNode> recordset=delaycomp.livecode(lb);
108 Set<FlatNode> cannotdelay=delaycomp.getCannotDelay(lb);
109 Set<FlatNode> otherset=delaycomp.getOther(lb);
110 Set<FlatNode> notreadyset=delaycomp.getNotReady(lb);
111 Set<FlatNode> derefset=(state.STMARRAY&&!state.DUALVIEW)?delaycomp.getDeref(lb):null;
112 Set<FlatNode> checkset=new HashSet<FlatNode>();
113 checkset.addAll(cannotdelay);
114 checkset.addAll(otherset);
116 Set<FlatNode> nrecordset=new HashSet<FlatNode>();
117 HashSet<FlatNode> ncannotdelay=new HashSet<FlatNode>();
118 Set<FlatNode> notherset=new HashSet<FlatNode>();
119 Set<FlatNode> nnotready=new HashSet<FlatNode>();
120 Set<FlatNode> nderef=new HashSet<FlatNode>();
122 recordmap.put(lb, nrecordset);
123 cannotdelaymap.put(lb, ncannotdelay);
124 notreadymap.put(lb, nnotready);
125 othermap.put(lb, notherset);
126 derefmap.put(lb, nderef);
128 FlatMethod fm=state.getMethodFlat(lb.getMethod());
129 for(Iterator<FlatNode> fnit=fm.getNodeSet().iterator();fnit.hasNext();) {
130 FlatNode fn=fnit.next();
131 if (fn.kind()==FKind.FlatAtomicEnterNode&&
132 locality.getAtomic(lb).get(fn.getPrev(0)).intValue()==0) {
133 Set<FlatNode> transSet=computeTrans(lb, fn);
134 Set<FlatNode> tCheckSet=intersect(checkset, transSet);
135 Set<FlatNode> tRecordSet=intersect(recordset, transSet);
136 Set<FlatNode> tOtherSet=intersect(otherset, transSet);
137 Set<FlatNode> tNotReadySet=intersect(notreadyset, transSet);
138 HashSet<FlatNode> tCannotDelay=intersect(cannotdelay, transSet);
139 Set<FlatNode> tderef=(state.STMARRAY&&!state.DUALVIEW)?intersect(derefset, transSet):null;
141 if (checkSet(fn, tCheckSet, tRecordSet, lb)) {
142 //We will convert this one
143 nrecordset.addAll(tRecordSet);
144 notherset.addAll(tOtherSet);
145 nnotready.addAll(tNotReadySet);
146 ncannotdelay.addAll(tCannotDelay);
147 if (state.STMARRAY&&!state.DUALVIEW)
148 nderef.addAll(tderef);
149 transmap.get(lb).add(fn);
151 ncannotdelay.addAll(transSet);
153 if (!lwmap.containsKey(lb))
154 lwmap.put(lb, new HashSet<FlatNode>());
155 lwmap.get(lb).add(fn);
157 if (locality.getAtomic(lb).get(fn).intValue()==0)
158 ncannotdelay.add(fn);
163 Hashtable<LocalityBinding, Set<FlatNode>> lwmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
164 Hashtable<LocalityBinding, Set<FlatNode>> optmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
166 public boolean lightweightTrans(LocalityBinding lb, FlatNode fn) {
167 return lwmap.get(lb).contains(fn);
170 public boolean optimizeTrans(LocalityBinding lb, FlatNode fn) {
171 return optmap.get(lb).contains(fn);
174 private boolean checkSet(FlatNode faen, Set<FlatNode> checkset, Set<FlatNode> recordset, LocalityBinding lb) {
175 if (!optmap.containsKey(lb)) {
176 optmap.put(lb, new HashSet<FlatNode>());
178 DiscoverConflicts dc=delaycomp.getConflicts();
179 for(Iterator<FlatNode> fnit=checkset.iterator();fnit.hasNext();) {
180 FlatNode fn=fnit.next();
182 if (!state.READSET&&dc.getNeedTrans(lb, fn)||state.READSET&&dc.getNeedWriteTrans(lb, fn)||fn.kind()==FKind.FlatCall) {
183 System.out.println("False because"+fn);
189 optmap.get(lb).add(faen);
193 private Set<FlatNode> computeTrans(LocalityBinding lb, FlatNode faen) {
194 HashSet<FlatNode> transSet=new HashSet<FlatNode>();
195 HashSet<FlatNode> toProcess=new HashSet<FlatNode>();
197 while(!toProcess.isEmpty()) {
198 FlatNode fn=toProcess.iterator().next();
199 toProcess.remove(fn);
201 if (locality.getAtomic(lb).get(fn).intValue()==0)
203 for(int i=0;i<fn.numNext();i++) {
204 if (!transSet.contains(fn.getNext(i)))
205 toProcess.add(fn.getNext(i));