# HG changeset patch # User Lukas Stadler # Date 1370425666 -7200 # Node ID fe02e8159afaca757b357107f51330238ad3c8da # Parent 975cc822632a35778e7c05345e3429259c06a3d1 PEA: changes to allow BlockState to be extended diff -r 975cc822632a -r fe02e8159afa graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java Wed Jun 05 11:46:19 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java Wed Jun 05 11:47:46 2013 +0200 @@ -30,11 +30,11 @@ import com.oracle.graal.nodes.spi.Virtualizable.EscapeState; import com.oracle.graal.nodes.virtual.*; -class BlockState { +public class BlockState { - private final IdentityHashMap objectStates = new IdentityHashMap<>(); - private final IdentityHashMap objectAliases; - private final IdentityHashMap scalarAliases; + protected final IdentityHashMap objectStates = new IdentityHashMap<>(); + protected final IdentityHashMap objectAliases; + protected final IdentityHashMap scalarAliases; final HashMap readCache; static class ReadCacheEntry { @@ -144,6 +144,10 @@ return new BlockState(this); } + public BlockState cloneEmptyState() { + return new BlockState(); + } + public void materializeBefore(FixedNode fixed, VirtualObjectNode virtual, EscapeState state, GraphEffectList materializeEffects) { PartialEscapeClosure.METRIC_MATERIALIZATIONS.increment(); List objects = new ArrayList<>(2); @@ -239,39 +243,14 @@ return objectStates + " " + readCache; } - public BlockState meetAliases(List states) { - BlockState newState = new BlockState(); - - BlockState firstState = states.get(0); - newState.objectAliases.putAll(firstState.objectAliases); + public void meetAliases(List states) { + objectAliases.putAll(states.get(0).objectAliases); + scalarAliases.putAll(states.get(0).scalarAliases); for (int i = 1; i < states.size(); i++) { BlockState state = states.get(i); - Iterator> iter = newState.objectAliases.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - if (state.objectAliases.containsKey(entry.getKey())) { - assert state.objectAliases.get(entry.getKey()) == entry.getValue(); - } else { - iter.remove(); - } - } + meetMaps(objectAliases, state.objectAliases); + meetMaps(scalarAliases, state.scalarAliases); } - - newState.scalarAliases.putAll(firstState.scalarAliases); - for (int i = 1; i < states.size(); i++) { - BlockState state = states.get(i); - Iterator> iter = newState.scalarAliases.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - if (state.scalarAliases.containsKey(entry.getKey())) { - assert state.scalarAliases.get(entry.getKey()) == entry.getValue(); - } else { - iter.remove(); - } - } - } - - return newState; } public Map getReadCache() { @@ -289,14 +268,14 @@ return objectAliasesEqual && objectStatesEqual && readCacheEqual && scalarAliasesEqual; } - private static boolean compareMaps(Map left, Map right) { + protected static boolean compareMaps(Map left, Map right) { if (left.size() != right.size()) { return false; } return compareMapsNoSize(left, right); } - private static boolean compareMapsNoSize(Map left, Map right) { + protected static boolean compareMapsNoSize(Map left, Map right) { if (left == right) { return true; } @@ -312,4 +291,16 @@ return true; } + protected static void meetMaps(Map target, Map source) { + Iterator> iter = target.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + if (source.containsKey(entry.getKey())) { + assert source.get(entry.getKey()) == entry.getValue(); + } else { + iter.remove(); + } + } + } + } diff -r 975cc822632a -r fe02e8159afa graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Wed Jun 05 11:46:19 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Wed Jun 05 11:47:46 2013 +0200 @@ -48,7 +48,7 @@ import com.oracle.graal.virtual.phases.ea.BlockState.ReadCacheEntry; import com.oracle.graal.virtual.phases.ea.EffectList.Effect; -class PartialEscapeClosure extends PartialEscapeAnalysisPhase.Closure { +public class PartialEscapeClosure extends PartialEscapeAnalysisPhase.Closure { public static final DebugMetric METRIC_MATERIALIZATIONS = Debug.metric("Materializations"); public static final DebugMetric METRIC_MATERIALIZATIONS_PHI = Debug.metric("MaterializationsPhi"); @@ -476,7 +476,8 @@ @SuppressWarnings("unchecked") private void merge(List states) { - newState = (BlockT) states.get(0).meetAliases(states); + newState = (BlockT) states.get(0).cloneEmptyState(); + newState.meetAliases(states); /* * Iterative processing: Merging the materialized/virtual state of virtual objects can