# HG changeset patch # User Doug Simon # Date 1402677895 -7200 # Node ID 1a6746681b43d08fd356cc507f11f0ef227bc062 # Parent c7db9dc736947e368c22e7c675567e97f58bd51c# Parent 99e2e006ade2a7f9e10da9d3381ac21000c3a6b4 Merge. diff -r c7db9dc73694 -r 1a6746681b43 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- 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(); diff -r c7db9dc73694 -r 1a6746681b43 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- 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; diff -r c7db9dc73694 -r 1a6746681b43 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- 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; diff -r c7db9dc73694 -r 1a6746681b43 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java --- 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 returnDuplicates = new ArrayList<>(returnNodes.size()); @@ -454,7 +452,6 @@ } returnValuePhi.addInput(returnNode.result()); } - returnNode.clearInputs(); returnNode.replaceAndDelete(endNode); } diff -r c7db9dc73694 -r 1a6746681b43 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java --- 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 replacementNodes = new ArrayList<>(); - Collection 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 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; } diff -r c7db9dc73694 -r 1a6746681b43 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/InstanceOfSnippetsTemplates.java --- 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); } diff -r c7db9dc73694 -r 1a6746681b43 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 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); }