changeset 16299:732a9e80e8dc

ensure memory map (if any) for a snippet template is attached to the returnNode
author Doug Simon <doug.simon@oracle.com>
date Mon, 30 Jun 2014 17:27:40 +0200
parents 3e4c83ac68d2
children 8da760bd1575
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java
diffstat 1 files changed, 9 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Mon Jun 30 17:24:15 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Mon Jun 30 17:27:40 2014 +0200
@@ -687,24 +687,23 @@
         List<ReturnNode> returnNodes = snippet.getNodes(ReturnNode.class).snapshot();
         if (returnNodes.isEmpty()) {
             this.returnNode = null;
-            this.memoryMap = null;
         } else if (returnNodes.size() == 1) {
             this.returnNode = returnNodes.get(0);
-            this.memoryMap = returnNode.getMemoryMap();
         } else {
             MergeNode merge = snippet.add(new MergeNode());
             List<MemoryMapNode> memMaps = returnNodes.stream().map(n -> n.getMemoryMap()).collect(Collectors.toList());
             ValueNode returnValue = InliningUtil.mergeReturns(merge, returnNodes, null);
             this.returnNode = snippet.add(new ReturnNode(returnValue));
             MemoryMapImpl mmap = FloatingReadPhase.mergeMemoryMaps(merge, memMaps);
-            this.memoryMap = snippet.unique(new MemoryMapNode(mmap.getMap()));
-            merge.setNext(this.returnNode);
-
+            MemoryMapNode memoryMap = snippet.unique(new MemoryMapNode(mmap.getMap()));
+            this.returnNode.setMemoryMap(memoryMap);
             for (MemoryMapNode mm : memMaps) {
-                if (mm.isAlive()) {
-                    mm.safeDelete();
+                if (mm != memoryMap && mm.isAlive()) {
+                    assert mm.usages().isEmpty();
+                    GraphUtil.killWithUnusedFloatingInputs(mm);
                 }
             }
+            merge.setNext(this.returnNode);
         }
 
         this.sideEffectNodes = curSideEffectNodes;
@@ -794,11 +793,6 @@
     private final ArrayList<Node> nodes;
 
     /**
-     * Map of killing locations to memory checkpoints (nodes).
-     */
-    private final MemoryMapNode memoryMap;
-
-    /**
      * Times instantiations of this template.
      *
      * @see SnippetInfo#instantiationTimer
@@ -957,6 +951,7 @@
             // no floating reads yet, ignore locations created while lowering
             return true;
         }
+        MemoryMapNode memoryMap = returnNode.getMemoryMap();
         if (memoryMap == null || memoryMap.isEmpty()) {
             // there are no kills in the snippet graph
             return true;
@@ -1018,6 +1013,7 @@
 
         @Override
         public MemoryNode getLastLocationAccess(LocationIdentity locationIdentity) {
+            MemoryMapNode memoryMap = returnNode.getMemoryMap();
             assert memoryMap != null : "no memory map stored for this snippet graph (snippet doesn't have a ReturnNode?)";
             MemoryNode lastLocationAccess = memoryMap.getLastLocationAccess(locationIdentity);
             assert lastLocationAccess != null;
@@ -1030,7 +1026,7 @@
 
         @Override
         public Collection<LocationIdentity> getLocations() {
-            return memoryMap.getLocations();
+            return returnNode.getMemoryMap().getLocations();
         }
     }