Mercurial > hg > graal-compiler
changeset 9877:fe02e8159afa
PEA: changes to allow BlockState to be extended
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Wed, 05 Jun 2013 11:47:46 +0200 |
parents | 975cc822632a |
children | d0a007fb65af |
files | graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java |
diffstat | 2 files changed, 30 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- 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<VirtualObjectNode, ObjectState> objectStates = new IdentityHashMap<>(); - private final IdentityHashMap<ValueNode, VirtualObjectNode> objectAliases; - private final IdentityHashMap<ValueNode, ValueNode> scalarAliases; + protected final IdentityHashMap<VirtualObjectNode, ObjectState> objectStates = new IdentityHashMap<>(); + protected final IdentityHashMap<ValueNode, VirtualObjectNode> objectAliases; + protected final IdentityHashMap<ValueNode, ValueNode> scalarAliases; final HashMap<ReadCacheEntry, ValueNode> 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<AllocatedObjectNode> objects = new ArrayList<>(2); @@ -239,39 +243,14 @@ return objectStates + " " + readCache; } - public BlockState meetAliases(List<? extends BlockState> states) { - BlockState newState = new BlockState(); - - BlockState firstState = states.get(0); - newState.objectAliases.putAll(firstState.objectAliases); + public void meetAliases(List<? extends BlockState> 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<Map.Entry<ValueNode, VirtualObjectNode>> iter = newState.objectAliases.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry<ValueNode, VirtualObjectNode> 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<Map.Entry<ValueNode, ValueNode>> iter = newState.scalarAliases.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry<ValueNode, ValueNode> entry = iter.next(); - if (state.scalarAliases.containsKey(entry.getKey())) { - assert state.scalarAliases.get(entry.getKey()) == entry.getValue(); - } else { - iter.remove(); - } - } - } - - return newState; } public Map<ReadCacheEntry, ValueNode> getReadCache() { @@ -289,14 +268,14 @@ return objectAliasesEqual && objectStatesEqual && readCacheEqual && scalarAliasesEqual; } - private static <K, V> boolean compareMaps(Map<K, V> left, Map<K, V> right) { + protected static <K, V> boolean compareMaps(Map<K, V> left, Map<K, V> right) { if (left.size() != right.size()) { return false; } return compareMapsNoSize(left, right); } - private static <K, V> boolean compareMapsNoSize(Map<K, V> left, Map<K, V> right) { + protected static <K, V> boolean compareMapsNoSize(Map<K, V> left, Map<K, V> right) { if (left == right) { return true; } @@ -312,4 +291,16 @@ return true; } + protected static <U, V> void meetMaps(Map<U, V> target, Map<U, V> source) { + Iterator<Map.Entry<U, V>> iter = target.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry<U, V> entry = iter.next(); + if (source.containsKey(entry.getKey())) { + assert source.get(entry.getKey()) == entry.getValue(); + } else { + iter.remove(); + } + } + } + }
--- 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<BlockT extends BlockState> extends PartialEscapeAnalysisPhase.Closure<BlockT> { +public class PartialEscapeClosure<BlockT extends BlockState> extends PartialEscapeAnalysisPhase.Closure<BlockT> { 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<BlockT> 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