Mercurial > hg > graal-compiler
changeset 15595:804326a882f0
don't delete snippet MemoryAnchorNodes if they are used in the memory map
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 12 May 2014 16:38:58 +0200 |
parents | 62738ce98804 |
children | 7903324bc739 |
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, 13 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java Mon May 12 11:43:36 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java Mon May 12 16:38:58 2014 +0200 @@ -41,5 +41,5 @@ public abstract Set<LocationIdentity> getLocations(); - public abstract void replaceLastLocationAccess(MemoryNode oldNode, MemoryNode newNode); + public abstract boolean replaceLastLocationAccess(MemoryNode oldNode, MemoryNode newNode); }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Mon May 12 11:43:36 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Mon May 12 16:38:58 2014 +0200 @@ -92,12 +92,15 @@ } @Override - public void replaceLastLocationAccess(MemoryNode oldNode, MemoryNode newNode) { + public boolean replaceLastLocationAccess(MemoryNode oldNode, MemoryNode newNode) { + boolean replaced = false; for (Map.Entry<LocationIdentity, MemoryNode> entry : lastMemorySnapshot.entrySet()) { if (entry.getValue() == oldNode) { entry.setValue(newNode); + replaced = true; } } + return replaced; } }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon May 12 11:43:36 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon May 12 16:38:58 2014 +0200 @@ -643,11 +643,6 @@ MemoryAnchorNode memoryAnchor = snippetCopy.add(new MemoryAnchorNode()); snippetCopy.start().replaceAtUsages(InputType.Memory, memoryAnchor); - if (memoryAnchor.usages().isEmpty()) { - memoryAnchor.safeDelete(); - } else { - snippetCopy.addAfterFixed(snippetCopy.start(), memoryAnchor); - } this.snippet = snippetCopy; @@ -656,9 +651,10 @@ List<ReturnNode> returnNodes = new ArrayList<>(4); List<MemoryMapNode> memMaps = new ArrayList<>(4); StartNode entryPointNode = snippet.start(); + boolean anchorUsed = false; for (ReturnNode retNode : snippet.getNodes(ReturnNode.class)) { MemoryMapNode memMap = retNode.getMemoryMap(); - memMap.replaceLastLocationAccess(snippetCopy.start(), memoryAnchor); + anchorUsed |= memMap.replaceLastLocationAccess(snippetCopy.start(), memoryAnchor); memMaps.add(memMap); retNode.setMemoryMap(null); returnNodes.add(retNode); @@ -666,6 +662,11 @@ memMap.safeDelete(); } } + if (memoryAnchor.usages().isEmpty() && !anchorUsed) { + memoryAnchor.safeDelete(); + } else { + snippetCopy.addAfterFixed(snippetCopy.start(), memoryAnchor); + } assert snippet.getNodes().filter(MemoryMapNode.class).isEmpty(); if (returnNodes.isEmpty()) { this.returnNode = null; @@ -1009,7 +1010,7 @@ } @Override - public void replaceLastLocationAccess(MemoryNode oldNode, MemoryNode newNode) { + public boolean replaceLastLocationAccess(MemoryNode oldNode, MemoryNode newNode) { throw GraalInternalError.shouldNotReachHere(); } }