changeset 11676:435c8b984680

Distinguish inputs and successors in in-place updates.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 17 Sep 2013 01:14:21 +0200
parents 77d9f12797c5
children 9d341b6e47e5
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java
diffstat 2 files changed, 25 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Tue Sep 17 00:30:01 2013 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Tue Sep 17 01:14:21 2013 +0200
@@ -456,7 +456,7 @@
                 oldSuccessor.predecessor = null;
             }
             if (newSuccessor != null) {
-                assert assertTrue(newSuccessor.predecessor == null, "unexpected non-null predecessor in new successor (%s): %s", newSuccessor, newSuccessor.predecessor);
+                assert assertTrue(newSuccessor.predecessor == null, "unexpected non-null predecessor in new successor (%s): %s, this=%s", newSuccessor, newSuccessor.predecessor, this);
                 newSuccessor.predecessor = this;
             }
         }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Tue Sep 17 00:30:01 2013 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Tue Sep 17 01:14:21 2013 +0200
@@ -673,12 +673,12 @@
         return fieldNames.get(pos.input ? inputOffsets[pos.index] : successorOffsets[pos.index]);
     }
 
-    void updateInputSuccInPlace(Node node, DuplicationReplacement duplicationReplacement) {
+    void updateInputSuccInPlace(Node node, InplaceUpdateClosure duplicationReplacement) {
         int index = 0;
         while (index < directInputCount) {
             Node input = getNode(node, inputOffsets[index]);
             if (input != null) {
-                Node newInput = duplicationReplacement.replacement(input);
+                Node newInput = duplicationReplacement.replacement(input, true);
                 node.updateUsages(null, newInput);
                 putNode(node, inputOffsets[index], newInput);
             }
@@ -693,7 +693,7 @@
         while (index < directSuccessorCount) {
             Node successor = getNode(node, successorOffsets[index]);
             if (successor != null) {
-                Node newSucc = duplicationReplacement.replacement(successor);
+                Node newSucc = duplicationReplacement.replacement(successor, false);
                 node.updatePredecessor(null, newSucc);
                 putNode(node, successorOffsets[index], newSucc);
             }
@@ -705,7 +705,7 @@
         }
     }
 
-    private void updateInputLists(Node node, DuplicationReplacement duplicationReplacement, int startIndex) {
+    private void updateInputLists(Node node, InplaceUpdateClosure duplicationReplacement, int startIndex) {
         int index = startIndex;
         while (index < inputOffsets.length) {
             NodeList<Node> list = getNodeList(node, inputOffsets[index]);
@@ -715,7 +715,7 @@
         }
     }
 
-    private void updateSuccLists(Node node, DuplicationReplacement duplicationReplacement, int startIndex) {
+    private void updateSuccLists(Node node, InplaceUpdateClosure duplicationReplacement, int startIndex) {
         int index = startIndex;
         while (index < successorOffsets.length) {
             NodeList<Node> list = getNodeList(node, successorOffsets[index]);
@@ -725,26 +725,26 @@
         }
     }
 
-    private static NodeInputList<Node> updateInputListCopy(NodeList<Node> list, Node node, DuplicationReplacement duplicationReplacement) {
+    private static NodeInputList<Node> updateInputListCopy(NodeList<Node> list, Node node, InplaceUpdateClosure duplicationReplacement) {
         int size = list.size();
         NodeInputList<Node> result = new NodeInputList<>(node, size);
         for (int i = 0; i < list.count(); ++i) {
             Node oldNode = list.get(i);
             if (oldNode != null) {
-                Node newNode = duplicationReplacement.replacement(oldNode);
+                Node newNode = duplicationReplacement.replacement(oldNode, true);
                 result.set(i, newNode);
             }
         }
         return result;
     }
 
-    private static NodeSuccessorList<Node> updateSuccListCopy(NodeList<Node> list, Node node, DuplicationReplacement duplicationReplacement) {
+    private static NodeSuccessorList<Node> updateSuccListCopy(NodeList<Node> list, Node node, InplaceUpdateClosure duplicationReplacement) {
         int size = list.size();
         NodeSuccessorList<Node> result = new NodeSuccessorList<>(node, size);
         for (int i = 0; i < list.count(); ++i) {
             Node oldNode = list.get(i);
             if (oldNode != null) {
-                Node newNode = duplicationReplacement.replacement(oldNode);
+                Node newNode = duplicationReplacement.replacement(oldNode, false);
                 result.set(i, newNode);
             }
         }
@@ -1047,23 +1047,29 @@
         return nameTemplate;
     }
 
+    interface InplaceUpdateClosure {
+
+        Node replacement(Node node, boolean isInput);
+    }
+
     static Map<Node, Node> addGraphDuplicate(final Graph graph, final Graph oldGraph, int estimatedNodeCount, Iterable<Node> nodes, final DuplicationReplacement replacements) {
         final Map<Node, Node> newNodes = (estimatedNodeCount > (oldGraph.getNodeCount() + oldGraph.getDeletedNodeCount() >> 4)) ? new NodeNodeMap(oldGraph) : new IdentityHashMap<Node, Node>();
         createNodeDuplicates(graph, nodes, replacements, newNodes);
 
-        DuplicationReplacement replacementClosure = new DuplicationReplacement() {
+        InplaceUpdateClosure replacementClosure = new InplaceUpdateClosure() {
 
-            public Node replacement(Node input) {
-                Node target = newNodes.get(input);
+            public Node replacement(Node node, boolean isInput) {
+                Node target = newNodes.get(node);
                 if (target == null) {
-                    Node replacement = input;
+                    Node replacement = node;
                     if (replacements != null) {
-                        replacement = replacements.replacement(input);
+                        replacement = replacements.replacement(node);
                     }
-                    if (replacement != input) {
+                    if (replacement != node) {
                         target = replacement;
-                    } else if (input.graph() == graph) { // patch to the outer world
-                        target = input;
+                    } else if (node.graph() == graph && isInput) {
+                        // patch to the outer world
+                        target = node;
                     }
 
                 }
@@ -1077,7 +1083,7 @@
             Node node = newNodes.get(oldNode);
             NodeClass oldNodeClass = oldNode.getNodeClass();
             NodeClass nodeClass = node.getNodeClass();
-            if (oldNodeClass == nodeClass && (replacements == null || replacements.replacement(oldNode) == oldNode)) {
+            if (replacements == null || replacements.replacement(oldNode) == oldNode) {
                 nodeClass.updateInputSuccInPlace(node, replacementClosure);
             } else {
                 transferValuesDifferentNodeClass(graph, replacements, newNodes, oldNode, node, oldNodeClass, nodeClass);