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());
42 case FKind.FlatElementNode:
44 FlatElementNode fen=(FlatElementNode)fn;
45 return !nb.contains(fen.getSrc());
48 case FKind.FlatSetFieldNode:
50 FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
51 return !nb.contains(fsfn.getDst());
59 Hashtable<FlatNode,HashSet<TempDescriptor>> needbarrier;
61 public void analyze(LocalityBinding lb) {
62 MethodDescriptor md=lb.getMethod();
63 FlatMethod fm=state.getMethodFlat(md);
64 HashSet useful=new HashSet();
65 HashSet toprocess=new HashSet();
66 HashSet discovered=new HashSet();
67 needbarrier=new Hashtable<FlatNode,HashSet<TempDescriptor>>();
68 toprocess.add(fm.getNext(0));
69 discovered.add(fm.getNext(0));
70 Hashtable<FlatNode, Integer> atomic=la.getAtomic(lb);
72 while(!toprocess.isEmpty()) {
73 FlatNode fn=(FlatNode)toprocess.iterator().next();
75 for(int i=0; i<fn.numNext(); i++) {
76 FlatNode nnext=fn.getNext(i);
77 if (!discovered.contains(nnext)) {
79 discovered.add(nnext);
82 HashSet<TempDescriptor> nb=computeIntersection(fn);
83 TempDescriptor[] writes=fn.writesTemps();
84 for(int i=0; i<writes.length; i++) {
88 case FKind.FlatSetElementNode:
90 FlatSetElementNode fsen=(FlatSetElementNode)fn;
92 nb.add(fsen.getDst());
96 case FKind.FlatSetFieldNode:
98 FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
99 nb.add(fsfn.getDst());
103 case FKind.FlatOpNode:
105 FlatOpNode fon=(FlatOpNode)fn;
106 if (fon.getOp().getOp()==Operation.ASSIGN) {
107 if (nb.contains(fon.getLeft())) {
108 nb.add(fon.getDest());
116 FlatNew fnew=(FlatNew)fn;
117 nb.add(fnew.getDst());
122 //If we enter a transaction toss everything
123 if (atomic.get(fn).intValue()>0&&
124 atomic.get(fn.getPrev(0)).intValue()==0) {
125 nb=new HashSet<TempDescriptor>();
128 if (!needbarrier.containsKey(fn)||
129 !needbarrier.get(fn).equals(nb)) {
130 for(int i=0; i<fn.numNext(); i++) {
131 FlatNode nnext=fn.getNext(i);
132 toprocess.add(nnext);
134 needbarrier.put(fn,nb);
138 HashSet<TempDescriptor> computeIntersection(FlatNode fn) {
139 HashSet<TempDescriptor> tab=new HashSet<TempDescriptor>();
141 for(int i=0; i<fn.numPrev(); i++) {
142 FlatNode fprev=fn.getPrev(i);
143 HashSet<TempDescriptor> hs=needbarrier.get(fprev);
150 for(Iterator<TempDescriptor> it=tab.iterator(); it.hasNext(); ) {
151 TempDescriptor t=it.next();