# HG changeset patch # User Bernhard Urban # Date 1394808054 -3600 # Node ID 145b31ba9a57eccda0c79ed26f02a7a04709e7e4 # Parent f659d019d3ab9153631e7c419a1392c4efbc36e5 SnippetTemplate: don't use dummy node for replace diff -r f659d019d3ab -r 145b31ba9a57 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 Fri Mar 14 15:29:17 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Fri Mar 14 15:40:54 2014 +0100 @@ -876,10 +876,11 @@ @Override public void replace(ValueNode oldNode, ValueNode newNode, MemoryMapNode mmap) { - if (mmap != null && newNode != null) { + if (mmap != null) { for (Node usage : oldNode.usages().snapshot()) { LocationIdentity identity = getLocationIdentity(usage); - if (identity != null && identity != LocationIdentity.FINAL_LOCATION) { + boolean usageReplaced = false; + if (identity != null && identity != FINAL_LOCATION) { // lastLocationAccess points into the snippet graph. find a proper // MemoryCheckPoint inside the snippet graph MemoryNode lastAccess = mmap.getLastLocationAccess(identity); @@ -888,17 +889,26 @@ if (usage instanceof MemoryAccess) { MemoryAccess access = (MemoryAccess) usage; if (access.getLastLocationAccess() == oldNode) { - assert newNode.graph().isAfterFloatingReadPhase(); + assert oldNode.graph().isAfterFloatingReadPhase(); access.setLastLocationAccess(lastAccess); + usageReplaced = true; } } else { assert usage instanceof MemoryProxy || usage instanceof MemoryPhiNode; usage.replaceFirstInput(oldNode, lastAccess.asNode()); + usageReplaced = true; } } + if (!usageReplaced) { + assert newNode != null : "this branch is only valid if we have a newNode for replacement"; + } } } - oldNode.replaceAtUsages(newNode); + if (newNode == null) { + assert oldNode.usages().isEmpty(); + } else { + oldNode.replaceAtUsages(newNode); + } } }; @@ -1036,7 +1046,7 @@ returnValue = returnDuplicate.result(); MemoryMapNode mmap = new DuplicateMapper(duplicates, replaceeGraph.start()); if (returnValue == null && replacee.usages().isNotEmpty() && replacee instanceof MemoryCheckpoint) { - replacer.replace(replacee, (ValueNode) returnDuplicate.predecessor(), mmap); + replacer.replace(replacee, null, mmap); } else { assert returnValue != null || replacee.usages().isEmpty(); replacer.replace(replacee, returnValue, mmap);