From 400b2141727b16db53892b60c62c671f5b07e4b9 Mon Sep 17 00:00:00 2001 From: stephey Date: Mon, 25 Oct 2010 08:08:35 +0000 Subject: [PATCH] Improved heuristics for marking where resume cases are possible. Instead marking every conflict as a possible resume case, it now only marks cases where there is a read conflict (which implies that there is a write somewhere else) or where there is an ancestor read conflict and a current conflict. --- .../src/IR/Flat/RuntimeConflictResolver.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Robust/src/IR/Flat/RuntimeConflictResolver.java b/Robust/src/IR/Flat/RuntimeConflictResolver.java index 29ec23a5..937fdaa1 100644 --- a/Robust/src/IR/Flat/RuntimeConflictResolver.java +++ b/Robust/src/IR/Flat/RuntimeConflictResolver.java @@ -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 edges, Hashtable 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()) { -- 2.34.1