changeset 14541:145b31ba9a57

SnippetTemplate: don't use dummy node for replace
author Bernhard Urban <bernhard.urban@jku.at>
date Fri, 14 Mar 2014 15:40:54 +0100
parents f659d019d3ab
children 084603b0bfbb
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java
diffstat 1 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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);