1 package Analysis.Loops;
3 import Analysis.Locality.*;
6 import IR.MethodDescriptor;
7 import java.util.HashSet;
8 import java.util.Hashtable;
9 import java.util.Iterator;
11 public class WriteBarrier {
12 /* This computes whether we actually need a write barrier. */
17 public WriteBarrier(LocalityAnalysis la, State state) {
23 public void turnoff() {
27 public void turnon() {
31 public boolean needBarrier(FlatNode fn) {
34 HashSet<TempDescriptor> nb=computeIntersection(fn);
36 case FKind.FlatSetElementNode:
38 FlatSetElementNode fsen=(FlatSetElementNode)fn;
39 return !nb.contains(fsen.getDst());
41 case FKind.FlatElementNode:
43 FlatElementNode fen=(FlatElementNode)fn;
44 return !nb.contains(fen.getSrc());
46 case FKind.FlatSetFieldNode:
48 FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
49 return !nb.contains(fsfn.getDst());
56 Hashtable<FlatNode,HashSet<TempDescriptor>> needbarrier;
58 public void analyze(LocalityBinding lb) {
59 MethodDescriptor md=lb.getMethod();
60 FlatMethod fm=state.getMethodFlat(md);
61 HashSet useful=new HashSet();
62 HashSet toprocess=new HashSet();
63 HashSet discovered=new HashSet();
64 needbarrier=new Hashtable<FlatNode,HashSet<TempDescriptor>>();
65 toprocess.add(fm.getNext(0));
66 discovered.add(fm.getNext(0));
67 Hashtable<FlatNode, Integer> atomic=la.getAtomic(lb);
69 while(!toprocess.isEmpty()) {
70 FlatNode fn=(FlatNode)toprocess.iterator().next();
72 for(int i=0;i<fn.numNext();i++) {
73 FlatNode nnext=fn.getNext(i);
74 if (!discovered.contains(nnext)) {
76 discovered.add(nnext);
79 HashSet<TempDescriptor> nb=computeIntersection(fn);
80 TempDescriptor[] writes=fn.writesTemps();
81 for(int i=0;i<writes.length;i++) {
85 case FKind.FlatSetElementNode:
87 FlatSetElementNode fsen=(FlatSetElementNode)fn;
89 nb.add(fsen.getDst());
92 case FKind.FlatSetFieldNode:
94 FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
95 nb.add(fsfn.getDst());
98 case FKind.FlatOpNode:
100 FlatOpNode fon=(FlatOpNode)fn;
101 if (fon.getOp().getOp()==Operation.ASSIGN) {
102 if (nb.contains(fon.getLeft())) {
103 nb.add(fon.getDest());
110 FlatNew fnew=(FlatNew)fn;
111 nb.add(fnew.getDst());
115 //If we enter a transaction toss everything
116 if (atomic.get(fn).intValue()>0&&
117 atomic.get(fn.getPrev(0)).intValue()==0) {
118 nb=new HashSet<TempDescriptor>();
121 if (!needbarrier.containsKey(fn)||
122 !needbarrier.get(fn).equals(nb)) {
123 for(int i=0;i<fn.numNext();i++) {
124 FlatNode nnext=fn.getNext(i);
125 toprocess.add(nnext);
127 needbarrier.put(fn,nb);
131 HashSet<TempDescriptor> computeIntersection(FlatNode fn) {
132 HashSet<TempDescriptor> tab=new HashSet<TempDescriptor>();
134 for(int i=0;i<fn.numPrev();i++) {
135 FlatNode fprev=fn.getPrev(i);
136 HashSet<TempDescriptor> hs=needbarrier.get(fprev);
143 for(Iterator<TempDescriptor> it=tab.iterator();it.hasNext();) {
144 TempDescriptor t=it.next();