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