From: bdemsky Date: Mon, 11 Oct 2010 07:48:19 +0000 (+0000) Subject: hack OoOJava RCR to not run disjointness twice...we don't need fine-grained conflicts... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7b1dfe6111b064c85233448dc778ab3be26a0100;p=IRC.git hack OoOJava RCR to not run disjointness twice...we don't need fine-grained conflicts with RCR... --- diff --git a/Robust/src/Analysis/OoOJava/ConflictGraph.java b/Robust/src/Analysis/OoOJava/ConflictGraph.java index fc97c140..9d99c41f 100644 --- a/Robust/src/Analysis/OoOJava/ConflictGraph.java +++ b/Robust/src/Analysis/OoOJava/ConflictGraph.java @@ -10,6 +10,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.Map.Entry; +import IR.State; import Analysis.Disjoint.AllocSite; import Analysis.Disjoint.DisjointAnalysis; @@ -33,8 +34,10 @@ public class ConflictGraph { public static final int FINE_GRAIN_EDGE = 1; public static final int COARSE_GRAIN_EDGE = 2; public static final int CONFLICT = 3; + State state; - public ConflictGraph() { + public ConflictGraph(State state) { + this.state=state; id2cn = new Hashtable(); sese2te = new Hashtable>>(); } @@ -422,6 +425,13 @@ public class ConflictGraph { } } } else { + if (state.RCR) { + //need coarse effects for RCR from just one pass + addCoarseEffect(nodeA, asA, effectA); + if (!nodeA.equals(nodeB)) { + addCoarseEffect(nodeB, asB, effectB); + } + } return ConflictGraph.CONFLICT; } } diff --git a/Robust/src/Analysis/OoOJava/OoOJavaAnalysis.java b/Robust/src/Analysis/OoOJava/OoOJavaAnalysis.java index 819ea516..2cc4119e 100644 --- a/Robust/src/Analysis/OoOJava/OoOJavaAnalysis.java +++ b/Robust/src/Analysis/OoOJava/OoOJavaAnalysis.java @@ -195,19 +195,21 @@ public class OoOJavaAnalysis { Set sitesToFlag = new HashSet(); calculateConflicts(sitesToFlag, false); - // 9th pass, ask disjoint analysis to compute reachability - // for objects that may cause heap conflicts so the most - // efficient method to deal with conflict can be computed - // later - disjointAnalysisReach = + if (!state.RCR) { + // 9th pass, ask disjoint analysis to compute reachability + // for objects that may cause heap conflicts so the most + // efficient method to deal with conflict can be computed + // later + + disjointAnalysisReach = new DisjointAnalysis(state, typeUtil, callGraph, liveness, arrayReferencees, sitesToFlag, - null, // don't do effects analysis again! - null // don't do effects analysis again! - ); - // 10th pass, calculate conflicts with reachability info - calculateConflicts(null, true); - + null, // don't do effects analysis again! + null // don't do effects analysis again! + ); + // 10th pass, calculate conflicts with reachability info + calculateConflicts(null, true); + } // 11th pass, compiling locks synthesizeLocks(); @@ -986,7 +988,7 @@ public class OoOJavaAnalysis { ConflictGraph conflictGraph = sese2conflictGraph.get(seseStack.peek()); if (conflictGraph == null) { - conflictGraph = new ConflictGraph(); + conflictGraph = new ConflictGraph(state); } conflictGraph_nodeAction(fn, seseStack.peek()); @@ -1021,7 +1023,7 @@ public class OoOJavaAnalysis { } conflictGraph = sese2conflictGraph.get(currentSESE.getParent()); if (conflictGraph == null) { - conflictGraph = new ConflictGraph(); + conflictGraph = new ConflictGraph(state); } FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn; @@ -1044,7 +1046,7 @@ public class OoOJavaAnalysis { conflictGraph = sese2conflictGraph.get(currentSESE); if (conflictGraph == null) { - conflictGraph = new ConflictGraph(); + conflictGraph = new ConflictGraph(state); } if (fn instanceof FlatFieldNode) { @@ -1070,7 +1072,7 @@ public class OoOJavaAnalysis { conflictGraph = sese2conflictGraph.get(currentSESE); if (conflictGraph == null) { - conflictGraph = new ConflictGraph(); + conflictGraph = new ConflictGraph(state); } if (fn instanceof FlatSetFieldNode) { @@ -1097,7 +1099,7 @@ public class OoOJavaAnalysis { case FKind.FlatCall: { conflictGraph = sese2conflictGraph.get(currentSESE); if (conflictGraph == null) { - conflictGraph = new ConflictGraph(); + conflictGraph = new ConflictGraph(state); } FlatCall fc = (FlatCall) fn; diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 4094df3f..4adce576 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -275,8 +275,7 @@ public class BuildCode { try { rcr = new RuntimeConflictResolver(PREFIX); rcr.setGlobalEffects(oooa.getDisjointAnalysis().getEffectsAnalysis().getAllEffects()); - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { System.out.println("Runtime Conflict Resolver could not create output file."); } } @@ -289,11 +288,22 @@ public class BuildCode { if(state.RCR && rcr != null) { Analysis.OoOJava.ConflictGraph conflictGraph; Hashtable> conflicts; + + System.out.println("-------"); + System.out.println(fsen); + System.out.println(fsen.getIsCallerSESEplaceholder()); + System.out.println(fsen.getParent()); + + if (fsen.getParent()!=null) { + conflictGraph = oooa.getConflictGraph(fsen.getParent()); + System.out.println("CG="+conflictGraph); + if (conflictGraph!=null) + System.out.println("Conflicts="+conflictGraph.getConflictEffectSet(fsen)); + } if(!fsen.getIsCallerSESEplaceholder() && fsen.getParent()!=null && (conflictGraph = oooa.getConflictGraph(fsen.getParent())) != null && - (conflicts = conflictGraph.getConflictEffectSet(fsen)) != null){ - + (conflicts = conflictGraph.getConflictEffectSet(fsen)) != null) { FlatMethod fm=fsen.getfmEnclosing(); ReachGraph rg=oooa.getDisjointAnalysis().getReachGraph(fm.getMethod()); if(rcr.cSideDebug) @@ -3039,7 +3049,6 @@ public class BuildCode { if((conflictGraph != null) && (conflicts = graph.getConflictEffectSet(fn)) != null && (rg != null)){ - rcr.addToTraverseToDoList(fn, waitingElement.getTempDesc(), rg, conflicts); } } diff --git a/Robust/src/IR/Flat/RuntimeConflictResolver.java b/Robust/src/IR/Flat/RuntimeConflictResolver.java index 29512a5a..b37587b0 100644 --- a/Robust/src/IR/Flat/RuntimeConflictResolver.java +++ b/Robust/src/IR/Flat/RuntimeConflictResolver.java @@ -23,7 +23,7 @@ import IR.TypeDescriptor; * Note: All computation is done upon closing the object. Steps 1-3 only input data */ public class RuntimeConflictResolver { - public static final boolean javaDebug = false; + public static final boolean javaDebug = true; public static final boolean cSideDebug = false; private PrintWriter cFile; @@ -121,7 +121,7 @@ public class RuntimeConflictResolver { public void addToTraverseToDoList(FlatSESEEnterNode rblock, ReachGraph rg, Hashtable> conflicts) { //Add to todo list toTraverse.add(new TraversalInfo(rblock, rg)); - + //Add to Global conflicts for(Taint t: conflicts.keySet()) { if(globalConflicts.containsKey(t)) { @@ -174,7 +174,7 @@ public class RuntimeConflictResolver { } //This is to prevent duplicate traversals from being generated - if(doneTaints.containsKey(taint) && doneTaints.get(taint) != null) + if(doneTaints.containsKey(taint)) return; doneTaints.put(taint, traverserIDCounter++); @@ -208,7 +208,7 @@ public class RuntimeConflictResolver { return; } - if(doneTaints.containsKey(taint) && doneTaints.get(taint) != null) + if(doneTaints.containsKey(taint)) return; doneTaints.put(taint, traverserIDCounter++); @@ -284,12 +284,10 @@ public class RuntimeConflictResolver { if(t.f instanceof FlatSESEEnterNode) { traverseSESEBlock((FlatSESEEnterNode)t.f, t.rg); - } - else { + } else { if(t.invar == null) { System.out.println("RCR ERROR: Attempted to run a stall site traversal with NO INVAR"); - } - else { + } else { traverseStallSite(t.f, t.invar, t.rg); } } @@ -320,8 +318,7 @@ public class RuntimeConflictResolver { cFile.println(" case " + doneTaints.get(t)+ ":"); if(t.isRBlockTaint()) { cFile.println(" " + this.getTraverserInvocation(t.getVar(), "startingPtr", t.getSESE())); - } - else if (t.isStallSiteTaint()){ + } else if (t.isStallSiteTaint()){ cFile.println(" " + this.getTraverserInvocation(t.getVar(), "startingPtr", t.getStallSite())); } else { System.out.println("RuntimeConflictResolver encountered a taint that is neither SESE nor stallsite: " + t); @@ -349,7 +346,7 @@ public class RuntimeConflictResolver { if (table == null) return; - Iterator possibleEdges = varNode.iteratorToReferencees(); + Iterator possibleEdges = varNode.iteratorToReferencees(); while (possibleEdges.hasNext()) { RefEdge edge = possibleEdges.next(); assert edge != null; @@ -1093,7 +1090,7 @@ public class RuntimeConflictResolver { bucket = new BucketOfEffects(); table.put(e.getAffectedAllocSite(), bucket); } - printDebug(javaDebug, "Added Taint" + t + " Effect " + e + "Conflict Status = " + (localConflicts!=null?localConflicts.contains(e):false)); + printDebug(javaDebug, "Added Taint" + t + " Effect " + e + "Conflict Status = " + (localConflicts!=null?localConflicts.contains(e):false)+" localConflicts = "+localConflicts); bucket.add(t, e, localConflicts!=null?localConflicts.contains(e):false); } }