# HG changeset patch # User Doug Simon # Date 1404142060 -7200 # Node ID 732a9e80e8dcf6752c11a4b9b01fc667093ec4d6 # Parent 3e4c83ac68d243c264b5d257444e0fa9c5a295e8 ensure memory map (if any) for a snippet template is attached to the returnNode diff -r 3e4c83ac68d2 -r 732a9e80e8dc graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- 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 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 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 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 getLocations() { - return memoryMap.getLocations(); + return returnNode.getMemoryMap().getLocations(); } }