package Analysis.Locality;
+import Analysis.Liveness;
import java.util.*;
import Analysis.CallGraph.CallGraph;
import IR.SymbolTable;
import IR.TypeUtil;
import IR.MethodDescriptor;
import IR.Flat.*;
+import Analysis.Liveness;
import IR.ClassDescriptor;
public class LocalityAnalysis {
State state;
- Stack lbtovisit;
+ Set lbtovisit;
Hashtable<LocalityBinding,LocalityBinding> discovered;
Hashtable<LocalityBinding, Set<LocalityBinding>> dependence;
Hashtable<LocalityBinding, Set<LocalityBinding>> calldep;
Hashtable<MethodDescriptor, Set<LocalityBinding>> methodtolb;
private LocalityBinding lbmain;
private LocalityBinding lbrun;
+ private LocalityBinding lbexecute;
CallGraph callgraph;
TypeUtil typeutil;
this.calldep=new Hashtable<LocalityBinding, Set<LocalityBinding>>();
this.temptab=new Hashtable<LocalityBinding, Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>>();
this.atomictab=new Hashtable<LocalityBinding, Hashtable<FlatNode, Integer>>();
- this.lbtovisit=new Stack();
+ this.lbtovisit=new HashSet();
this.callgraph=callgraph;
this.tempstosave=new Hashtable<LocalityBinding, Hashtable<FlatAtomicEnterNode, Set<TempDescriptor>>>();
this.classtolb=new Hashtable<ClassDescriptor, Set<LocalityBinding>>();
Stack<LocalityBinding> lbstack=new Stack<LocalityBinding>();
lbstack.add(lbmain);
lbstack.add(lbrun);
+
lbset.add(lbmain);
lbset.add(lbrun);
+
+ if(state.DSMTASK) { // when Task.java is used
+ lbstack.add(lbexecute);
+ lbset.add(lbexecute);
+ }
while(!lbstack.isEmpty()) {
LocalityBinding lb=lbstack.pop();
if (calldep.containsKey(lb)) {
methodtolb.put(lbrun.getMethod(), new HashSet<LocalityBinding>());
methodtolb.get(lbrun.getMethod()).add(lbrun);
- while(!lbtovisit.empty()) {
- LocalityBinding lb=(LocalityBinding) lbtovisit.pop();
+ while(!lbtovisit.isEmpty()) {
+ LocalityBinding lb=(LocalityBinding) lbtovisit.iterator().next();
+ lbtovisit.remove(lb);
+
+ System.out.println("Analyzing "+lb);
+
Integer returnglobal=lb.getGlobalReturn();
MethodDescriptor md=lb.getMethod();
Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>> temptable=new Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>();
temptab.put(lb, temptable);
atomictab.put(lb, atomictable);
- if (md.getReturnType()!=null&&!returnglobal.equals(lb.getGlobalReturn())) {
+ if (md.getReturnType()!=null&&md.getReturnType().isPtr()&&!returnglobal.equals(lb.getGlobalReturn())) {
//return type is more precise now
//rerun everything that call us
lbtovisit.addAll(dependence.get(lb));
FlatMethod fm=state.getMethodFlat(md);
HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
tovisit.add(fm.getNext(0));
+
{
// Build table for initial node
Hashtable<TempDescriptor,Integer> table=new Hashtable<TempDescriptor,Integer>();
for(int i=offset; i<fm.numParameters(); i++) {
TempDescriptor temp=fm.getParameter(i);
Integer b=lb.isGlobal(i-offset);
+ if (b!=null)
table.put(temp,b);
}
}
+ Hashtable<FlatNode, Set<TempDescriptor>> livemap=Liveness.computeLiveTemps(fm);
+
while(!tovisit.isEmpty()) {
FlatNode fn=tovisit.iterator().next();
tovisit.remove(fn);
+ Set<TempDescriptor> liveset=livemap.get(fn);
Hashtable<TempDescriptor, Integer> currtable=new Hashtable<TempDescriptor, Integer>();
int atomicstate=0;
for(int i=0; i<fn.numPrev(); i++) {
Hashtable<TempDescriptor, Integer> prevtable=temptable.get(prevnode);
for(Iterator<TempDescriptor> tempit=prevtable.keySet().iterator(); tempit.hasNext();) {
TempDescriptor temp=tempit.next();
+ if (!liveset.contains(temp))
+ continue;
Integer tmpint=prevtable.get(temp);
Integer oldint=currtable.containsKey(temp) ? currtable.get(temp) : STMEITHER;
Integer newint=mergestm(tmpint, oldint);
break;
case FKind.FlatOpNode:
- processOpNodeSTM((FlatOpNode)fn, currtable);
+ processOpNodeSTM(lb, (FlatOpNode)fn, currtable);
break;
case FKind.FlatCastNode:
if (runmethodset==null||!runmethodset.contains(md)) {
for(int i=0; i<fc.numArgs(); i++) {
TempDescriptor arg=fc.getArg(i);
- lb.setGlobal(i,currtable.get(arg));
+ if (currtable.containsKey(arg))
+ lb.setGlobal(i,currtable.get(arg));
}
if (fc.getThis()!=null) {
Integer thistype=currtable.get(fc.getThis());
}
} else {
Integer thistype=currtable.get(fc.getThis());
- if (!thistype.equals(NORMAL)) {
- throw new Error("Called start on possible scratch object");
+ if (!thistype.equals(NORMAL)&&!thistype.equals(STMEITHER)) {
+ throw new Error("Called start on possible scratch object"+thistype);
}
lb.setGlobal(0,currtable.get(fc.getThis()));
}
//lb is built
if (!discovered.containsKey(lb)) {
if (isnative) {
- if (nodemd.getReturnType()==null||!nodemd.getReturnType().isPtr())
- lb.setGlobalReturn(SCRATCH);
- else
+ if (nodemd.getReturnType()!=null&&nodemd.getReturnType().isPtr())
lb.setGlobalReturn(NORMAL);
} else
lb.setGlobalReturn(STMEITHER);
lb.setParent(currlb);
lbtovisit.add(lb);
+ System.out.println("New lb:"+lb);
discovered.put(lb, lb);
if (!classtolb.containsKey(lb.getMethod().getClassDesc()))
classtolb.put(lb.getMethod().getClassDesc(), new HashSet<LocalityBinding>());
calldep.put(currlb, new HashSet<LocalityBinding>());
calldep.get(currlb).add(lb);
}
- if (fc.getReturnTemp()!=null) {
+ if (fc.getReturnTemp()!=null&&fc.getReturnTemp().getType().isPtr()) {
currtable.put(fc.getReturnTemp(), currreturnval);
}
}
void processFieldNodeSTM(LocalityBinding lb, FlatFieldNode ffn, Hashtable<TempDescriptor, Integer> currtable) {
Integer type=currtable.get(ffn.getSrc());
TempDescriptor dst=ffn.getDst();
+ if (!ffn.getDst().getType().isPtr())
+ return;
+
if (type.equals(SCRATCH)) {
currtable.put(dst,SCRATCH);
} else if (type.equals(NORMAL)) {
- if (ffn.getField().getType().isPrimitive()&&!ffn.getField().getType().isArray())
- currtable.put(dst, SCRATCH); // primitives are local
- else
- currtable.put(dst, NORMAL);
+ currtable.put(dst, NORMAL);
} else if (type.equals(STMEITHER)) {
- if (ffn.getField().getType().isPrimitive()&&!ffn.getField().getType().isArray())
- currtable.put(dst, SCRATCH); // primitives are local
- else
- currtable.put(dst, STMEITHER);
+ currtable.put(dst, STMEITHER);
} else if (type.equals(STMCONFLICT)) {
throw new Error("Access to object that could be either normal or scratch in context:\n"+ffn+" "+lb.getExplanation());
}
void processSetFieldNodeSTM(LocalityBinding lb, FlatSetFieldNode fsfn, Hashtable<TempDescriptor, Integer> currtable) {
Integer srctype=currtable.get(fsfn.getSrc());
Integer dsttype=currtable.get(fsfn.getDst());
+ if (!fsfn.getSrc().getType().isPtr())
+ return;
+ if (dsttype==null)
+ System.out.println(fsfn);
if (dsttype.equals(SCRATCH)) {
- if (srctype.equals(SCRATCH) && fsfn.getField().getType().isPrimitive() && !fsfn.getField().getType().isArray())
- return;
if (!(srctype.equals(SCRATCH)||srctype.equals(STMEITHER)))
throw new Error("Writing possible normal reference to scratch object in context: \n"+lb.getExplanation());
} else if (dsttype.equals(NORMAL)) {
//okay to store primitives in global object
- if (srctype.equals(SCRATCH) && fsfn.getField().getType().isPrimitive() && !fsfn.getField().getType().isArray())
- return;
if (!(srctype.equals(NORMAL)||srctype.equals(STMEITHER)))
throw new Error("Writing possible scratch reference to normal object in context:\n"+lb.getExplanation()+" for FlatFieldNode "+fsfn);
} else if (dsttype.equals(STMEITHER)) {
void processSetElementNodeSTM(LocalityBinding lb, FlatSetElementNode fsen, Hashtable<TempDescriptor, Integer> currtable) {
Integer srctype=currtable.get(fsen.getSrc());
Integer dsttype=currtable.get(fsen.getDst());
+ if (!fsen.getSrc().getType().isPtr())
+ return;
if (dsttype.equals(SCRATCH)) {
if (!(srctype.equals(SCRATCH)||srctype.equals(STMEITHER)))
throw new Error("Writing possible normal reference to scratch object in context:\n"+lb.getExplanation()+fsen);
} else if (dsttype.equals(NORMAL)) {
- if (srctype.equals(SCRATCH) && fsen.getDst().getType().dereference().isPrimitive() && !fsen.getDst().getType().dereference().isArray())
- return;
if (!(srctype.equals(NORMAL)||srctype.equals(STMEITHER)))
throw new Error("Writing possible scratch reference to normal object in context:\n"+lb.getExplanation());
} else if (dsttype.equals(STMEITHER)) {
}
}
- void processOpNodeSTM(FlatOpNode fon, Hashtable<TempDescriptor, Integer> currtable) {
+ void processOpNodeSTM(LocalityBinding lb, FlatOpNode fon, Hashtable<TempDescriptor, Integer> currtable) {
/* Just propagate value */
+ if (!fon.getLeft().getType().isPtr())
+ return;
+
Integer srcvalue=currtable.get(fon.getLeft());
if (srcvalue==null) {
- if (!fon.getLeft().getType().isPtr()) {
- srcvalue=SCRATCH;
- } else
- throw new Error(fon.getLeft()+" is undefined!");
+ System.out.println(fon);
+ MethodDescriptor md=lb.getMethod();
+ FlatMethod fm=state.getMethodFlat(md);
+ System.out.println(fm.printMethod());
+ throw new Error(fon.getLeft()+" is undefined!");
}
currtable.put(fon.getDest(), srcvalue);
}
- void processCastNodeSTM(FlatCastNode fcn, Hashtable<TempDescriptor, Integer> currtable) {
- currtable.put(fcn.getDst(), currtable.get(fcn.getSrc()));
+ void processCastNodeSTM(FlatCastNode fcn, Hashtable<TempDescriptor, Integer> currtable) {
+ if (currtable.containsKey(fcn.getSrc()))
+ currtable.put(fcn.getDst(), currtable.get(fcn.getSrc()));
}
void processReturnNodeSTM(LocalityBinding lb, FlatReturnNode frn, Hashtable<TempDescriptor, Integer> currtable) {
- if(frn.getReturnTemp()!=null) {
+ if(frn.getReturnTemp()!=null&&frn.getReturnTemp().getType().isPtr()) {
Integer returntype=currtable.get(frn.getReturnTemp());
lb.setGlobalReturn(mergestm(returntype, lb.getGlobalReturn()));
}
currtable.put(fln.getDst(), STMEITHER);
else if (fln.getType().isPtr())
currtable.put(fln.getDst(), NORMAL);
- else
- currtable.put(fln.getDst(), SCRATCH);
}
void processElementNodeSTM(LocalityBinding lb, FlatElementNode fen, Hashtable<TempDescriptor, Integer> currtable) {
Integer type=currtable.get(fen.getSrc());
TempDescriptor dst=fen.getDst();
+ if (!fen.getDst().getType().isPtr())
+ return;
if (type==null) {
System.out.println(fen +" in "+lb+" may access undefined variable");
+ MethodDescriptor md=lb.getMethod();
+ FlatMethod fm=state.getMethodFlat(md);
+ System.out.println(fm.printMethod());
System.exit(-1);
} else if (type.equals(SCRATCH)) {
currtable.put(dst,SCRATCH);
} else if (type.equals(NORMAL)) {
- if(fen.getSrc().getType().dereference().isPrimitive()&&
- !fen.getSrc().getType().dereference().isArray())
- currtable.put(dst, SCRATCH);
- else
- currtable.put(dst, NORMAL);
+ currtable.put(dst, NORMAL);
} else if (type.equals(STMEITHER)) {
- if(fen.getSrc().getType().dereference().isPrimitive()&&
- !fen.getSrc().getType().dereference().isArray())
- currtable.put(dst, SCRATCH);
- else
- currtable.put(dst, STMEITHER);
+ currtable.put(dst, STMEITHER);
} else if (type.equals(STMCONFLICT)) {
throw new Error("Access to object that could be either global or local in context:\n"+lb.getExplanation());
}
methodtolb.put(lbrun.getMethod(), new HashSet<LocalityBinding>());
methodtolb.get(lbrun.getMethod()).add(lbrun);
- while(!lbtovisit.empty()) {
- LocalityBinding lb=(LocalityBinding) lbtovisit.pop();
+ if(state.DSMTASK) {
+ lbexecute = new LocalityBinding(typeutil.getExecute(), false);
+ lbexecute.setGlobalReturn(EITHER);
+ lbexecute.setGlobalThis(GLOBAL);
+ lbtovisit.add(lbexecute);
+ discovered.put(lbexecute, lbexecute);
+ if (!classtolb.containsKey(lbexecute.getMethod().getClassDesc()))
+ classtolb.put(lbexecute.getMethod().getClassDesc(), new HashSet<LocalityBinding>());
+ classtolb.get(lbexecute.getMethod().getClassDesc()).add(lbexecute);
+
+ if (!methodtolb.containsKey(lbexecute.getMethod()))
+ methodtolb.put(lbexecute.getMethod(), new HashSet<LocalityBinding>());
+ methodtolb.get(lbexecute.getMethod()).add(lbexecute);
+ }
+
+ while(!lbtovisit.isEmpty()) {
+ LocalityBinding lb=(LocalityBinding) lbtovisit.iterator().next();
+ lbtovisit.remove(lb);
+
+ System.out.println("Analyzing "+lb);
Integer returnglobal=lb.getGlobalReturn();
MethodDescriptor md=lb.getMethod();
Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>> temptable=new Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>();
}
}
atomictable.put(fn, atomicstate);
+
// Process this node
switch(fn.kind()) {
case FKind.FlatAtomicEnterNode:
break;
case FKind.FlatCall:
- processCallNode(lb, (FlatCall)fn, currtable, isAtomic(atomictable, fn));
+ processCallNode(lb, (FlatCall)fn, currtable, isAtomic(atomictable, fn), temptable.get(fn));
break;
case FKind.FlatFieldNode:
return CONFLICT;
}
- void processCallNode(LocalityBinding currlb, FlatCall fc, Hashtable<TempDescriptor, Integer> currtable, boolean isatomic) {
+ void processCallNode(LocalityBinding currlb, FlatCall fc, Hashtable<TempDescriptor, Integer> currtable, boolean isatomic, Hashtable<TempDescriptor,Integer> oldtable) {
MethodDescriptor nodemd=fc.getMethod();
Set methodset=null;
Set runmethodset=null;
+ Set executemethodset=null;
if (nodemd.isStatic()||nodemd.getReturnType()==null) {
methodset=new HashSet();
if (nodemd.getClassDesc().getSymbol().equals(TypeUtil.ThreadClass)&&
nodemd.getSymbol().equals("start")&&!nodemd.getModifiers().isStatic()&&
nodemd.numParameters()==1&&nodemd.getParamType(0).isInt()) {
- assert(nodemd.getModifiers().isNative());
+ assert(nodemd.getModifiers().isNative());
- MethodDescriptor runmd=null;
- for(Iterator methodit=nodemd.getClassDesc().getMethodTable().getSet("run").iterator(); methodit.hasNext();) {
- MethodDescriptor md=(MethodDescriptor) methodit.next();
- if (md.numParameters()!=0||md.getModifiers().isStatic())
- continue;
- runmd=md;
- break;
- }
- if (runmd!=null) {
- runmethodset=callgraph.getMethods(runmd,fc.getThis().getType());
- methodset.addAll(runmethodset);
- } else throw new Error("Can't find run method");
+ MethodDescriptor runmd=null;
+
+ for(Iterator methodit=nodemd.getClassDesc().getMethodTable().getSet("run").iterator(); methodit.hasNext();) {
+ MethodDescriptor md=(MethodDescriptor) methodit.next();
+
+ if (md.numParameters()!=0||md.getModifiers().isStatic())
+ continue;
+ runmd=md;
+ break;
+ }
+ if (runmd!=null) {
+ runmethodset=callgraph.getMethods(runmd,fc.getThis().getType());
+ methodset.addAll(runmethodset);
+ } else throw new Error("Can't find run method");
+ }
+
+ if(state.DSMTASK) {
+ if (nodemd.getClassDesc().getSymbol().equals(TypeUtil.TaskClass) &&
+ nodemd.getSymbol().equals("execution") && !nodemd.getModifiers().isStatic() &&
+ nodemd.numParameters() == 0) {
+
+ assert(nodemd.getModifiers().isNative());
+ MethodDescriptor exemd = null;
+
+ for(Iterator methodit=nodemd.getClassDesc().getMethodTable().getSet("execute").iterator(); methodit.hasNext();) {
+ MethodDescriptor md = (MethodDescriptor) methodit.next();
+
+ if (md.numParameters() != 0 || md.getModifiers().isStatic())
+ continue;
+ exemd = md;
+ break;
+ }
+
+ if (exemd != null) {
+ executemethodset = callgraph.getMethods(exemd, fc.getThis().getType());
+ methodset.addAll(executemethodset);
+ } else throw new Error("Can't find execute method");
+ }
}
}
Integer currreturnval=EITHER; //Start off with the either value
+ if (oldtable!=null&&fc.getReturnTemp()!=null&&
+ oldtable.get(fc.getReturnTemp())!=null) {
+ //ensure termination
+ currreturnval=merge(currreturnval, oldtable.get(fc.getReturnTemp()));
+ }
+
for(Iterator methodit=methodset.iterator(); methodit.hasNext();) {
MethodDescriptor md=(MethodDescriptor) methodit.next();
if (isnative&&isatomic) {
System.out.println("Don't call native methods in atomic blocks!"+currlb.getMethod());
}
- if (runmethodset==null||!runmethodset.contains(md)) {
- //Skip this part if it is a run method
+
+ if ((runmethodset==null||!runmethodset.contains(md)) &&( executemethodset == null || !executemethodset.contains(md))) {
+ //Skip this part if it is a run method or execute method
for(int i=0; i<fc.numArgs(); i++) {
TempDescriptor arg=fc.getArg(i);
if(isnative&&(currtable.get(arg).equals(GLOBAL)||
if (thistype==null)
thistype=EITHER;
- if(runmethodset!=null&&runmethodset.contains(md)&&thistype.equals(LOCAL))
+ if(runmethodset!=null&&runmethodset.contains(md)&&thistype.equals(LOCAL) && executemethodset != null && executemethodset.contains(md))
throw new Error("Starting thread on local object not allowed in context:\n"+currlb.getExplanation());
if(isjoin&&thistype.equals(LOCAL))
throw new Error("Joining thread on local object not allowed in context:\n"+currlb.getExplanation());
if(thistype.equals(CONFLICT))
throw new Error("Using type that can be either local or global in context:\n"+currlb.getExplanation());
- if(runmethodset==null&&thistype.equals(GLOBAL)&&!isatomic && !isjoin)
+ if(runmethodset==null&&thistype.equals(GLOBAL)&&!isatomic && !isjoin && executemethodset == null) {
throw new Error("Using global object outside of transaction in context:\n"+currlb.getExplanation());
- if (runmethodset==null&&isnative&&thistype.equals(GLOBAL) && !isjoin && !isObjectgetType && !isObjecthashCode)
+ }
+ if (runmethodset==null&&isnative&&thistype.equals(GLOBAL) && !isjoin && executemethodset == null && !isObjectgetType && !isObjecthashCode)
throw new Error("Potential call to native method "+md+" on global objects:\n"+currlb.getExplanation());
lb.setGlobalThis(thistype);
}
if (!(srctype.equals(GLOBAL)||srctype.equals(EITHER)))
throw new Error("Writing possible local reference to global field in context: \n"+lb.getExplanation());
} else {
- if (!(srctype.equals(LOCAL)||srctype.equals(EITHER)))
+ if (!(srctype.equals(LOCAL)||srctype.equals(EITHER))) {
throw new Error("Writing possible global reference to local object in context: \n"+lb.getExplanation());
+ }
}
} else if (dsttype.equals(GLOBAL)) {
if (!transaction)
Integer dsttype=currtable.get(fsen.getDst());
if (dsttype.equals(LOCAL)) {
- if (!(srctype.equals(LOCAL)||srctype.equals(EITHER)))
+ if (!(srctype.equals(LOCAL)||srctype.equals(EITHER))) {
throw new Error("Writing possible global reference to local object in context:\n"+lb.getExplanation()+fsen);
+ }
} else if (dsttype.equals(GLOBAL)) {
if (srctype.equals(LOCAL) && fsen.getDst().getType().dereference().isPrimitive() && !fsen.getDst().getType().dereference().isArray())
return;
atomictable.put(fen, new Integer(atomic-1));
}
- Hashtable<FlatNode, Set<TempDescriptor>> computeLiveTemps(FlatMethod fm) {
- Hashtable<FlatNode, Set<TempDescriptor>> nodetotemps=new Hashtable<FlatNode, Set<TempDescriptor>>();
-
- Set<FlatNode> toprocess=fm.getNodeSet();
-
- while(!toprocess.isEmpty()) {
- FlatNode fn=toprocess.iterator().next();
- toprocess.remove(fn);
-
- List<TempDescriptor> reads=Arrays.asList(fn.readsTemps());
- List<TempDescriptor> writes=Arrays.asList(fn.writesTemps());
-
- HashSet<TempDescriptor> tempset=new HashSet<TempDescriptor>();
- for(int i=0; i<fn.numNext(); i++) {
- FlatNode fnnext=fn.getNext(i);
- if (nodetotemps.containsKey(fnnext))
- tempset.addAll(nodetotemps.get(fnnext));
- }
- tempset.removeAll(writes);
- tempset.addAll(reads);
- if (!nodetotemps.containsKey(fn)||
- !nodetotemps.get(fn).equals(tempset)) {
- nodetotemps.put(fn, tempset);
- for(int i=0; i<fn.numPrev(); i++)
- toprocess.add(fn.getPrev(i));
- }
- }
- return nodetotemps;
- }
-
private void computeTempstoSave() {
for(Iterator<LocalityBinding> lbit=getLocalityBindings().iterator(); lbit.hasNext();) {
LocalityBinding lb=lbit.next();
Hashtable<FlatNode, Hashtable<TempDescriptor, Integer>> temptab=getNodeTempInfo(lb);
MethodDescriptor md=lb.getMethod();
FlatMethod fm=state.getMethodFlat(md);
- Hashtable<FlatNode, Set<TempDescriptor>> nodetotemps=computeLiveTemps(fm);
+ Hashtable<FlatNode, Set<TempDescriptor>> nodetotemps=Liveness.computeLiveTemps(fm);
Hashtable<FlatAtomicEnterNode, Set<TempDescriptor>> nodetosavetemps=new Hashtable<FlatAtomicEnterNode, Set<TempDescriptor>>();
tempstosave.put(lb, nodetosavetemps);
Hashtable<FlatNode, FlatAtomicEnterNode> nodemap=new Hashtable<FlatNode, FlatAtomicEnterNode>();
boolean isatomic=atomictab.get(fn).intValue()>0;
if (isatomic&&
atomictab.get(fn.getPrev(0)).intValue()==0) {
- assert(fn.getPrev(0).kind()==FKind.FlatAtomicEnterNode);
+ assert(fn.kind()==FKind.FlatAtomicEnterNode);
nodemap.put(fn, (FlatAtomicEnterNode)fn);
nodetosavetemps.put((FlatAtomicEnterNode)fn, new HashSet<TempDescriptor>());
} else if (isatomic) {
FlatAtomicEnterNode atomicnode=nodemap.get(fn);
- Set<TempDescriptor> livetemps=nodetotemps.get(fn);
+ Set<TempDescriptor> livetemps=nodetotemps.get(atomicnode);
List<TempDescriptor> reads=Arrays.asList(fn.readsTemps());
- List<TempDescriptor> writes=Arrays.asList(fn.readsTemps());
+ List<TempDescriptor> writes=Arrays.asList(fn.writesTemps());
for(Iterator<TempDescriptor> tempit=livetemps.iterator(); tempit.hasNext();) {
TempDescriptor tmp=tempit.next();