changeset 16108:1a6746681b43

Merge.
author Doug Simon <doug.simon@oracle.com>
date Fri, 13 Jun 2014 18:44:55 +0200
parents c7db9dc73694 (current diff) 99e2e006ade2 (diff)
children ed7a88f43dc3
files
diffstat 7 files changed, 38 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Fri Jun 13 18:44:55 2014 +0200
@@ -735,9 +735,7 @@
         }
     }
 
-    public void clearInputs() {
-        assert assertFalse(isDeleted(), "cannot clear inputs of deleted node");
-
+    private void unregisterInputs() {
         for (Node input : inputs()) {
             if (input.recordsUsages()) {
                 removeThisFromUsages(input);
@@ -746,6 +744,12 @@
                 }
             }
         }
+    }
+
+    public void clearInputs() {
+        assert assertFalse(isDeleted(), "cannot clear inputs of deleted node");
+
+        unregisterInputs();
         getNodeClass().clearInputs(this);
     }
 
@@ -753,13 +757,17 @@
         return n.removeUsage(this);
     }
 
-    public void clearSuccessors() {
-        assert assertFalse(isDeleted(), "cannot clear successors of deleted node");
-
+    private void unregisterSuccessors() {
         for (Node successor : successors()) {
             assert assertTrue(successor.predecessor == this, "wrong predecessor in old successor (%s): %s", successor, successor.predecessor);
             successor.predecessor = null;
         }
+    }
+
+    public void clearSuccessors() {
+        assert assertFalse(isDeleted(), "cannot clear successors of deleted node");
+
+        unregisterSuccessors();
         getNodeClass().clearSuccessors(this);
     }
 
@@ -777,8 +785,8 @@
      */
     public void safeDelete() {
         assert checkDeletion();
-        clearInputs();
-        clearSuccessors();
+        unregisterInputs();
+        unregisterSuccessors();
         graph.unregister(this);
         id = DELETED_ID_START - id;
         assert isDeleted();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Jun 13 18:44:55 2014 +0200
@@ -229,15 +229,17 @@
                         trueNext.replaceAtPredecessor(next);
                         graph().addBeforeFixed(this, trueNext);
                         for (Node usage : trueNext.usages().snapshot()) {
-                            if (usage.getNodeClass().valueNumberable() && !usage.getNodeClass().isLeafNode()) {
-                                Node newNode = graph().findDuplicate(usage);
-                                if (newNode != null) {
-                                    usage.replaceAtUsages(newNode);
-                                    usage.safeDelete();
+                            if (usage.isAlive()) {
+                                if (usage.getNodeClass().valueNumberable() && !usage.getNodeClass().isLeafNode()) {
+                                    Node newNode = graph().findDuplicate(usage);
+                                    if (newNode != null) {
+                                        usage.replaceAtUsages(newNode);
+                                        usage.safeDelete();
+                                    }
                                 }
-                            }
-                            if (usage.isAlive()) {
-                                tool.addToWorkList(usage);
+                                if (usage.isAlive()) {
+                                    tool.addToWorkList(usage);
+                                }
                             }
                         }
                         continue;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Fri Jun 13 18:44:55 2014 +0200
@@ -181,6 +181,9 @@
     }
 
     public static void checkRedundantProxy(ProxyNode vpn) {
+        if (vpn.isDeleted()) {
+            return;
+        }
         BeginNode proxyPoint = vpn.proxyPoint();
         if (proxyPoint instanceof LoopExitNode) {
             LoopExitNode exit = (LoopExitNode) proxyPoint;
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Fri Jun 13 18:44:55 2014 +0200
@@ -289,7 +289,6 @@
                 stateAtExceptionEdge = obj.stateAfter();
                 UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode);
                 obj.replaceAtUsages(unwindDuplicate.exception());
-                unwindDuplicate.clearInputs();
                 Node n = obj.next();
                 obj.setNext(null);
                 unwindDuplicate.replaceAndDelete(n);
@@ -332,7 +331,6 @@
                 ReturnNode returnNode = (ReturnNode) duplicates.get(returnNodes.get(0));
                 Node returnValue = returnNode.result();
                 invokeNode.replaceAtUsages(returnValue);
-                returnNode.clearInputs();
                 returnNode.replaceAndDelete(n);
             } else {
                 ArrayList<ReturnNode> returnDuplicates = new ArrayList<>(returnNodes.size());
@@ -454,7 +452,6 @@
                 }
                 returnValuePhi.addInput(returnNode.result());
             }
-            returnNode.clearInputs();
             returnNode.replaceAndDelete(endNode);
 
         }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java	Fri Jun 13 18:44:55 2014 +0200
@@ -222,9 +222,7 @@
 
         ArrayList<GuardedValueNode> replacementNodes = new ArrayList<>();
 
-        Collection<Node> parameterUsages = new ArrayList<>();
-
-        // do the actual inlining for every invoke
+        // prepare the anchors for the invokes
         for (int i = 0; i < numberOfMethods; i++) {
             BeginNode node = successors[i];
             Invoke invokeForInlining = (Invoke) node.next();
@@ -241,8 +239,7 @@
             GuardedValueNode anchoredReceiver = InliningUtil.createAnchoredReceiver(graph, node, commonType, receiver, exact);
             invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver);
 
-            parameterUsages.addAll(inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false));
-
+            assert !anchoredReceiver.isDeleted() : anchoredReceiver;
             replacementNodes.add(anchoredReceiver);
         }
         if (shouldFallbackToInvoke()) {
@@ -274,6 +271,13 @@
                 TailDuplicationPhase.tailDuplicate(returnMerge, TailDuplicationPhase.TRUE_DECISION, replacementNodes, phaseContext, canonicalizer);
             }
         }
+
+        Collection<Node> parameterUsages = new ArrayList<>();
+        // do the actual inlining for every invoke
+        for (int i = 0; i < numberOfMethods; i++) {
+            Invoke invokeForInlining = (Invoke) successors[i].next();
+            parameterUsages.addAll(inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false));
+        }
         return parameterUsages;
     }
 
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/InstanceOfSnippetsTemplates.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/InstanceOfSnippetsTemplates.java	Fri Jun 13 18:44:55 2014 +0200
@@ -234,7 +234,6 @@
         public void replaceUsingInstantiation() {
             ValueNode newValue = instantiation.asMaterialization(usage.graph(), trueValue, falseValue);
             usage.replaceAtUsages(newValue);
-            usage.clearInputs();
             assert usage.usages().isEmpty();
             GraphUtil.killWithUnusedFloatingInputs(usage);
         }
@@ -246,7 +245,6 @@
             newNode.inferStamp();
             instantiation.initialize(newNode, trueValue, falseValue);
             usage.replaceAtUsages(newNode);
-            usage.clearInputs();
             assert usage.usages().isEmpty();
             GraphUtil.killWithUnusedFloatingInputs(usage);
         }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Fri Jun 13 18:42:33 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Fri Jun 13 18:44:55 2014 +0200
@@ -1147,14 +1147,11 @@
                         next = fwn.next();
                         fwn.setNext(null);
                     }
-                    returnDuplicate.clearInputs();
                     returnDuplicate.replaceAndDelete(next);
                 }
             }
 
             // Remove the replacee from its graph
-            replacee.clearInputs();
-            replacee.replaceAtUsages(null);
             GraphUtil.killCFG(replacee);
 
             Debug.dump(replaceeGraph, "After lowering %s with %s", replacee, this);
@@ -1241,7 +1238,6 @@
             replacer.replace(replacee, returnValue, new DuplicateMapper(duplicates, replaceeGraph.start()));
 
             if (returnDuplicate.isAlive()) {
-                returnDuplicate.clearInputs();
                 returnDuplicate.replaceAndDelete(next);
             }