hack OoOJava RCR to not run disjointness twice...we don't need fine-grained conflicts...
authorbdemsky <bdemsky>
Mon, 11 Oct 2010 07:48:19 +0000 (07:48 +0000)
committerbdemsky <bdemsky>
Mon, 11 Oct 2010 07:48:19 +0000 (07:48 +0000)
Robust/src/Analysis/OoOJava/ConflictGraph.java
Robust/src/Analysis/OoOJava/OoOJavaAnalysis.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/RuntimeConflictResolver.java

index fc97c14034707a10accfadc1dc81fe3585748a5b..9d99c41fd90bf1a461b67205920351eb2fd8d0c5 100644 (file)
@@ -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<String, ConflictNode>();
     sese2te = new Hashtable<FlatNode, Hashtable<Taint, Set<Effect>>>();
   }
@@ -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;
               }
             }
index 819ea516ebdf92306028aa4f8b82d8db0b0aea51..2cc4119ec735a0a484e612a6cb527f3e201823fd 100644 (file)
@@ -195,19 +195,21 @@ public class OoOJavaAnalysis {
     Set<FlatNew> sitesToFlag = new HashSet<FlatNew>();
     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;
index 4094df3f5983dd3350e015ed3b5476654f3f044b..4adce576a132b176c36b26a095caa6cf595e5d6f 100644 (file)
@@ -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<Taint, Set<Effect>> 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);
                    }
                 }
index 29512a5ac832e4beee14ee278fa19826683ec772..b37587b0dfd9c1578cc3deb0b643435a8561da14 100644 (file)
@@ -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<Taint, Set<Effect>> 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<RefEdge> possibleEdges = varNode.iteratorToReferencees();    
+    Iterator<RefEdge> 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);
         }
       }