+
+ public Hashtable<FlatCondBranch, Set<FlatNode>> revGetBranchSet(LocalityBinding lb) {
+ MethodDescriptor md=lb.getMethod();
+ FlatMethod fm=state.getMethodFlat(md);
+ Hashtable<FlatCondBranch, Set<FlatNode>> condmap=new Hashtable<FlatCondBranch, Set<FlatNode>>();
+ DomTree postdt=new DomTree(fm, true);
+ for(Iterator<FlatNode> fnit=fm.getNodeSet().iterator(); fnit.hasNext(); ) {
+ FlatNode fn=fnit.next();
+ if (fn.kind()!=FKind.FlatCondBranch)
+ continue;
+ FlatCondBranch fcb=(FlatCondBranch)fn;
+ //only worry about fcb inside of transactions
+ if (locality.getAtomic(lb).get(fcb).intValue()==0)
+ continue;
+ FlatNode postdom=postdt.idom(fcb);
+
+ //Reverse the mapping
+ Set<FlatNode> fnset=computeBranchSet(lb, fcb, postdom);
+ condmap.put(fcb, fnset);
+ }
+ return condmap;
+ }
+
+ public Hashtable<FlatNode, Set<FlatCondBranch>> getBranchSet(LocalityBinding lb) {
+ MethodDescriptor md=lb.getMethod();
+ FlatMethod fm=state.getMethodFlat(md);
+ Hashtable<FlatNode, Set<FlatCondBranch>> condmap=new Hashtable<FlatNode, Set<FlatCondBranch>>();
+ DomTree postdt=new DomTree(fm, true);
+ for(Iterator<FlatNode> fnit=fm.getNodeSet().iterator(); fnit.hasNext(); ) {
+ FlatNode fn=fnit.next();
+ if (fn.kind()!=FKind.FlatCondBranch)
+ continue;
+ FlatCondBranch fcb=(FlatCondBranch)fn;
+ //only worry about fcb inside of transactions
+ if (locality.getAtomic(lb).get(fcb).intValue()==0)
+ continue;
+ FlatNode postdom=postdt.idom(fcb);
+
+ //Reverse the mapping
+ Set<FlatNode> fnset=computeBranchSet(lb, fcb, postdom);
+ for(Iterator<FlatNode>fnit2=fnset.iterator(); fnit2.hasNext(); ) {
+ FlatNode fn2=fnit2.next();
+ if (!condmap.containsKey(fn2))
+ condmap.put(fn2,new HashSet<FlatCondBranch>());
+ condmap.get(fn2).add(fcb);
+ }
+ }
+ return condmap;
+ }
+
+ public Set<FlatNode> computeBranchSet(LocalityBinding lb, FlatNode first, FlatNode last) {
+ HashSet<FlatNode> toanalyze=new HashSet<FlatNode>();
+ HashSet<FlatNode> visited=new HashSet<FlatNode>();
+ toanalyze.add(first);
+
+ while(!toanalyze.isEmpty()) {
+ FlatNode fn=toanalyze.iterator().next();
+ toanalyze.remove(fn);
+
+ //already examined or exit node
+ if (visited.contains(fn)||fn==last)
+ continue;
+
+ //out of transaction
+ if (locality.getAtomic(lb).get(fn).intValue()==0)
+ continue;
+
+ visited.add(fn);
+ for(int i=0; i<fn.numNext(); i++) {
+ FlatNode fnext=fn.getNext(i);
+ toanalyze.add(fnext);
+ }
+ }
+ return visited;
+ } //end of computeBranchSet