Stack lbtovisit;
Hashtable<LocalityBinding,LocalityBinding> discovered;
Hashtable<LocalityBinding, Set<LocalityBinding>> dependence;
+ Hashtable<LocalityBinding, Set<LocalityBinding>> calldep;
Hashtable<LocalityBinding, Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>> temptab;
Hashtable<LocalityBinding, Hashtable<FlatNode, Integer>> atomictab;
Hashtable<LocalityBinding, Hashtable<FlatAtomicEnterNode, Set<TempDescriptor>>> tempstosave;
Hashtable<ClassDescriptor, Set<LocalityBinding>> classtolb;
Hashtable<MethodDescriptor, Set<LocalityBinding>> methodtolb;
private LocalityBinding lbmain;
+ private LocalityBinding lbrun;
CallGraph callgraph;
TypeUtil typeutil;
this.state=state;
this.discovered=new Hashtable<LocalityBinding,LocalityBinding>();
this.dependence=new Hashtable<LocalityBinding, Set<LocalityBinding>>();
+ 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();
private void doAnalysis() {
computeLocalityBindings();
computeTempstoSave();
+ cleanSets();
+ }
+
+ private void cleanSets() {
+ HashSet<LocalityBinding> lbset=new HashSet<LocalityBinding>();
+ Stack<LocalityBinding> lbstack=new Stack<LocalityBinding>();
+ lbstack.add(lbmain);
+ lbstack.add(lbrun);
+ lbset.add(lbmain);
+ lbset.add(lbrun);
+ while(!lbstack.isEmpty()) {
+ LocalityBinding lb=lbstack.pop();
+ if (calldep.containsKey(lb)) {
+ Set<LocalityBinding> set=new HashSet<LocalityBinding>();
+ set.addAll(calldep.get(lb));
+ set.removeAll(lbset);
+ lbstack.addAll(set);
+ lbset.addAll(set);
+ }
+ }
+ for(Iterator<LocalityBinding> lbit=discovered.keySet().iterator();lbit.hasNext();) {
+ LocalityBinding lb=lbit.next();
+ if (!lbset.contains(lb)) {
+ lbit.remove();
+ classtolb.get(lb.getMethod().getClassDesc()).remove(lb);
+ methodtolb.get(lb.getMethod()).remove(lb);
+ }
+ }
}
private void computeLocalityBindings() {
methodtolb.get(lbmain.getMethod()).add(lbmain);
//Do this to force a virtual table number for the run method
- LocalityBinding lbrun=new LocalityBinding(typeutil.getRun(), false);
+ lbrun=new LocalityBinding(typeutil.getRun(), false);
lbrun.setGlobalReturn(EITHER);
lbrun.setGlobalThis(GLOBAL);
lbtovisit.add(lbrun);
MethodDescriptor md=lb.getMethod();
Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>> temptable=new Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>();
Hashtable<FlatNode, Integer> atomictable=new Hashtable<FlatNode, Integer>();
+ calldep.remove(lb);
try {
computeCallsFlags(md, lb, temptable, atomictable);
} catch (Error e) {
if (!dependence.containsKey(lb))
dependence.put(lb, new HashSet<LocalityBinding>());
dependence.get(lb).add(currlb);
+
+ if (!calldep.containsKey(currlb))
+ calldep.put(currlb, new HashSet<LocalityBinding>());
+ calldep.get(currlb).add(lb);
}
if (fc.getReturnTemp()!=null) {
currtable.put(fc.getReturnTemp(), currreturnval);
{
Em3d em;
atomic {
- em = global new Em3d();
- em.parseCmdLine(args, em);
+ em = global new Em3d();
}
+ Em3d.parseCmdLine(args, em);
+
boolean printMsgs, printResult;
int numIter;
atomic {
* @param args the command line options.
**/
- public void parseCmdLine(String args[], Em3d em)
+ public static void parseCmdLine(String args[], Em3d em)
{
int i = 0;
String arg;
// check for options that require arguments
if (arg.equals("-n")) {
if (i < args.length) {
- em.numNodes = new Integer(args[i++]).intValue();
+ atomic {
+ em.numNodes = new Integer(args[i++]).intValue();
+ }
}
} else if (arg.equals("-d")) {
if (i < args.length) {
- em.numDegree = new Integer(args[i++]).intValue();
+ atomic {
+ em.numDegree = new Integer(args[i++]).intValue();
+ }
}
} else if (arg.equals("-i")) {
if (i < args.length) {
}
}
} else if (arg.equals("-p")) {
- em.printResult = true;
+ atomic {
+ em.printResult = true;
+ }
} else if (arg.equals("-m")) {
- em.printMsgs = true;
+ atomic {
+ em.printMsgs = true;
+ }
} else if (arg.equals("-h")) {
//em.usage();
}
printcomma=true;
}
- if (state.DSM&&lb.isAtomic()) {
+ if (state.DSM&&lb.isAtomic()&&!md.getModifiers().isNative()) {
if (printcomma)
headersout.print(", ");
headersout.print("transrecord_t * trans");
needcomma=true;
}
- if (state.DSM&&locality.getBinding(lb,fc).isAtomic()) {
+ if (state.DSM&&locality.getBinding(lb,fc).isAtomic()&&!fc.getMethod().getModifiers().isNative()) {
if (needcomma)
output.print(",");
output.print("trans");
output.println(dst+"->"+nextobjstr+"="+revertptr+";");
output.println("trans->revertlist=(struct ___Object___ *)"+dst+";");
output.println("}");
- } else {
- throw new Error("Unknown array type in"+fsen+" in " + fm+"\n"+(lb!=null?(lb+" "+lb.getExplanation()):""));
- }
+ } else throw new Error("Unknown array type");
if (srcglobal) {
output.println("{");
String src=generateTemp(fm, fsen.getSrc(), lb);