changeset 13691:056d9d7dc061

expose memory map merging functionality in FloatingReadPhase
author Lukas Stadler <lukas.stadler@jku.at>
date Wed, 15 Jan 2014 16:08:57 +0100
parents 08f58bfde0dd
children c215dec9d3cf
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java
diffstat 3 files changed, 53 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java	Wed Jan 15 16:07:01 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java	Wed Jan 15 16:08:57 2014 +0100
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.nodes;
 
+import java.util.*;
+
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
@@ -34,4 +36,6 @@
     }
 
     public abstract MemoryNode getLastLocationAccess(LocationIdentity locationIdentity);
+
+    public abstract Set<LocationIdentity> getLocations();
 }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java	Wed Jan 15 16:07:01 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java	Wed Jan 15 16:08:57 2014 +0100
@@ -84,6 +84,7 @@
             return false;
         }
 
+        @Override
         public Set<LocationIdentity> getLocations() {
             return lastMemorySnapshot.keySet();
         }
@@ -111,6 +112,46 @@
         }
     }
 
+    public static MemoryMapImpl mergeMemoryMaps(MergeNode merge, List<? extends MemoryMapNode> states) {
+        MemoryMapImpl newState = new MemoryMapImpl();
+
+        Set<LocationIdentity> keys = new HashSet<>();
+        for (MemoryMapNode other : states) {
+            keys.addAll(other.getLocations());
+        }
+        assert !keys.contains(FINAL_LOCATION);
+
+        for (LocationIdentity key : keys) {
+            int mergedStatesCount = 0;
+            boolean isPhi = false;
+            MemoryNode merged = null;
+            for (MemoryMapNode state : states) {
+                MemoryNode last = state.getLastLocationAccess(key);
+                if (isPhi) {
+                    merged.asMemoryPhi().addInput(ValueNodeUtil.asNode(last));
+                } else {
+                    if (merged == last) {
+                        // nothing to do
+                    } else if (merged == null) {
+                        merged = last;
+                    } else {
+                        MemoryPhiNode phi = merge.graph().addWithoutUnique(new MemoryPhiNode(merge, key));
+                        for (int j = 0; j < mergedStatesCount; j++) {
+                            phi.addInput(ValueNodeUtil.asNode(merged));
+                        }
+                        phi.addInput(ValueNodeUtil.asNode(last));
+                        merged = phi;
+                        isPhi = true;
+                    }
+                }
+                mergedStatesCount++;
+            }
+            newState.lastMemorySnapshot.put(key, merged);
+        }
+        return newState;
+
+    }
+
     private static class CollectMemoryCheckpointsClosure extends NodeIteratorClosure<Set<LocationIdentity>> {
 
         private final Map<LoopBeginNode, Set<LocationIdentity>> modifiedInLoops;
@@ -238,42 +279,7 @@
 
         @Override
         protected MemoryMapImpl merge(MergeNode merge, List<MemoryMapImpl> states) {
-            MemoryMapImpl newState = new MemoryMapImpl();
-
-            Set<LocationIdentity> keys = new HashSet<>();
-            for (MemoryMapImpl other : states) {
-                keys.addAll(other.lastMemorySnapshot.keySet());
-            }
-            assert !keys.contains(FINAL_LOCATION);
-
-            for (LocationIdentity key : keys) {
-                int mergedStatesCount = 0;
-                boolean isPhi = false;
-                MemoryNode merged = null;
-                for (MemoryMapImpl state : states) {
-                    MemoryNode last = state.getLastLocationAccess(key);
-                    if (isPhi) {
-                        merged.asMemoryPhi().addInput(ValueNodeUtil.asNode(last));
-                    } else {
-                        if (merged == last) {
-                            // nothing to do
-                        } else if (merged == null) {
-                            merged = last;
-                        } else {
-                            MemoryPhiNode phi = merge.graph().addWithoutUnique(new MemoryPhiNode(merge, key));
-                            for (int j = 0; j < mergedStatesCount; j++) {
-                                phi.addInput(ValueNodeUtil.asNode(merged));
-                            }
-                            phi.addInput(ValueNodeUtil.asNode(last));
-                            merged = phi;
-                            isPhi = true;
-                        }
-                    }
-                    mergedStatesCount++;
-                }
-                newState.lastMemorySnapshot.put(key, merged);
-            }
-            return newState;
+            return mergeMemoryMaps(merge, states);
         }
 
         @Override
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Wed Jan 15 16:07:01 2014 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Wed Jan 15 16:08:57 2014 +0100
@@ -720,7 +720,7 @@
 
     /**
      * Nodes that inherit the {@link DeoptimizingNode#getDeoptimizationState()} from the replacee
-     * during insantiation.
+     * during instantiation.
      */
     private final ArrayList<DeoptimizingNode> deoptNodes;
 
@@ -876,7 +876,7 @@
                         // MemoryCheckPoint inside the snippet graph
                         MemoryNode lastAccess = mmap.getLastLocationAccess(identity);
 
-                        assert lastAccess != null : "no mapping found for lowerable node " + oldNode + ". (No node in the snippet kill the same location as the lowerable node?)";
+                        assert lastAccess != null : "no mapping found for lowerable node " + oldNode + ". (No node in the snippet kills the same location as the lowerable node?)";
                         if (usage instanceof MemoryAccess) {
                             MemoryAccess access = (MemoryAccess) usage;
                             if (access.getLastLocationAccess() == oldNode) {
@@ -961,6 +961,11 @@
                 return (MemoryNode) duplicates.get(ValueNodeUtil.asNode(lastLocationAccess));
             }
         }
+
+        @Override
+        public Set<LocationIdentity> getLocations() {
+            return memoryMap.getLocations();
+        }
     }
 
     /**