Improved heuristics for marking where resume cases are possible. Instead marking...
authorstephey <stephey>
Mon, 25 Oct 2010 08:08:35 +0000 (08:08 +0000)
committerstephey <stephey>
Mon, 25 Oct 2010 08:08:35 +0000 (08:08 +0000)
Robust/src/IR/Flat/RuntimeConflictResolver.java

index 29ec23a5809d4d187d2a9474dfec94e427f3af33..937fdaa166908c9f6ba8d7339da8b95c912c8904 100644 (file)
@@ -469,7 +469,7 @@ public class RuntimeConflictResolver {
 
       if (!created.containsKey(rootKey)) {
         created.put(rootKey, singleRoot);
-        createHelper(singleRoot, edge.getDst().iteratorToReferencees(), created, table, t);
+        createHelper(singleRoot, edge.getDst().iteratorToReferencees(), created, table, t, false);
       }
     }
   }
@@ -480,8 +480,10 @@ public class RuntimeConflictResolver {
                             Iterator<RefEdge> edges, 
                             Hashtable<Integer, ConcreteRuntimeObjNode> created,
                             EffectsTable table, 
-                            Taint taint) {
+                            Taint taint,
+                            boolean ancestorCanBeIncorrectIn) {
     assert table != null;
+    boolean ancestorCanBeIncorrect = ancestorCanBeIncorrectIn;
     AllocSite parentKey = curr.allocSite;
     EffectsGroup currEffects = table.getEffects(parentKey, taint); 
     
@@ -511,8 +513,17 @@ public class RuntimeConflictResolver {
           curr.addObjChild(field, child, effectsForGivenField);
           
           if (effectsForGivenField.hasConflict()) {
-            child.hasPotentialToBeIncorrectDueToConflict = true;
             propagateObjConflict(curr, child);
+            
+            //Ancestor had a read conflict down this field
+            if(ancestorCanBeIncorrect) {
+              child.hasPotentialToBeIncorrectDueToConflict = true;
+            }
+            //read conflict implies that there's got to be a write somewhere else. 
+            else if(effectsForGivenField.hasReadConflict) {
+              child.hasPotentialToBeIncorrectDueToConflict = true;
+              ancestorCanBeIncorrect = true;
+            }
           }
           
           if(effectsForGivenField.hasReadEffect) {
@@ -520,7 +531,7 @@ public class RuntimeConflictResolver {
             
             //If isNewChild, flag propagation will be handled at recursive call
             if(isNewChild) {
-              createHelper(child, childHRN.iteratorToReferencees(), created, table, taint);
+              createHelper(child, childHRN.iteratorToReferencees(), created, table, taint, ancestorCanBeIncorrect);
             } else {
             //This makes sure that all conflicts below the child is propagated up the referencers.
               if(child.decendantsPrimConflict || child.hasPrimitiveConflicts()) {