Mercurial > hg > graal-compiler
changeset 23197:a4793f630f4c
Avoid notifying about nodes that are about to be deleted
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java Wed Dec 16 18:47:48 2015 -0800 @@ -227,7 +227,7 @@ public void rewrite(LoopsData loops) { InductionVariable inductionVariable = loops.getInductionVariable(iv); ValueNode node = property.get(inductionVariable); - graph().replaceFloating(this, node); + replaceAtUsagesAndDelete(node); } public void generate(NodeLIRBuilderTool gen) {
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Wed Dec 16 18:47:48 2015 -0800 @@ -670,10 +670,24 @@ } public final void replaceAtUsages(Node other) { - replaceAtUsages(other, null); + replaceAtUsages(other, null, null); } public final void replaceAtUsages(Node other, Predicate<Node> filter) { + replaceAtUsages(other, filter, null); + } + + public final void replaceAtUsagesAndDelete(Node other) { + replaceAtUsages(other, null, this); + safeDelete(); + } + + public final void replaceAtUsagesAndDelete(Node other, Predicate<Node> filter) { + replaceAtUsages(other, filter, this); + safeDelete(); + } + + protected void replaceAtUsages(Node other, Predicate<Node> filter, Node toBeDeleted) { assert checkReplaceWith(other); int i = 0; while (i < this.getUsageCount()) { @@ -681,7 +695,12 @@ if (filter == null || filter.test(usage)) { boolean result = usage.getNodeClass().getInputEdges().replaceFirst(usage, this, other); assert assertTrue(result, "not found in inputs, usage: %s", usage); - maybeNotifyInputChanged(usage); + /* + * Don't notify for nodes which are about to be deleted. + */ + if (toBeDeleted == null || usage != toBeDeleted) { + maybeNotifyInputChanged(usage); + } if (other != null) { other.addUsage(usage); } @@ -823,6 +842,7 @@ } private boolean checkDeletion() { + assertTrue(isAlive(), "must be alive"); assertTrue(hasNoUsages(), "cannot delete node %s because of usages: %s", this, usages()); assertTrue(predecessor == null, "cannot delete node %s because of predecessor: %s", this, predecessor); return true;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Wed Dec 16 18:47:48 2015 -0800 @@ -332,7 +332,7 @@ StructuredGraph graph = n.graph(); assert !n.getHub().isConstant(); AddressNode address = createOffsetAddress(graph, n.getHub(), config().klassLayoutHelperOffset); - graph.replaceFloating(n, graph.unique(new FloatingReadNode(address, KLASS_LAYOUT_HELPER_LOCATION, null, n.stamp(), n.getGuard(), BarrierType.NONE))); + n.replaceAtUsagesAndDelete(graph.unique(new FloatingReadNode(address, KLASS_LAYOUT_HELPER_LOCATION, null, n.stamp(), n.getGuard(), BarrierType.NONE))); } private void lowerHubGetClassNode(HubGetClassNode n, LoweringTool tool) { @@ -344,7 +344,7 @@ assert !n.getHub().isConstant(); AddressNode address = createOffsetAddress(graph, n.getHub(), config().classMirrorOffset); FloatingReadNode read = graph.unique(new FloatingReadNode(address, CLASS_MIRROR_LOCATION, null, n.stamp(), n.getGuard(), BarrierType.NONE)); - graph.replaceFloating(n, read); + n.replaceAtUsagesAndDelete(read); } private void lowerClassGetHubNode(ClassGetHubNode n, LoweringTool tool) { @@ -356,7 +356,7 @@ assert !n.getValue().isConstant(); AddressNode address = createOffsetAddress(graph, n.getValue(), config().klassOffset); FloatingReadNode read = graph.unique(new FloatingReadNode(address, CLASS_KLASS_LOCATION, null, n.stamp(), n.getGuard(), BarrierType.NONE)); - graph.replaceFloating(n, read); + n.replaceAtUsagesAndDelete(read); } private void lowerInvoke(Invoke invoke, LoweringTool tool, StructuredGraph graph) { @@ -466,7 +466,7 @@ StampProvider stampProvider = tool.getStampProvider(); LoadHubNode hub = graph.unique(new LoadHubNode(stampProvider, getClass.getObject())); HubGetClassNode hubGetClass = graph.unique(new HubGetClassNode(tool.getMetaAccess(), hub)); - graph.replaceFloating(getClass, hubGetClass); + getClass.replaceAtUsagesAndDelete(hubGetClass); hub.lower(tool); hubGetClass.lower(tool); } @@ -510,8 +510,7 @@ osrLocal.replaceAndDelete(load); graph.addBeforeFixed(migrationEnd, load); } - osrStart.replaceAtUsages(newStart); - osrStart.safeDelete(); + osrStart.replaceAtUsagesAndDelete(newStart); } }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java Wed Dec 16 18:47:48 2015 -0800 @@ -446,8 +446,7 @@ // Remove the phi function from all FrameStates where it is used and then delete it. assert node.usages().filter(isNotA(FrameState.class).nor(ValuePhiNode.class).nor(ProxyNode.class)).isEmpty() : "phi function that gets deletes must only be used in frame states"; - node.replaceAtUsages(null); - node.safeDelete(); + node.replaceAtUsagesAndDelete(null); for (FloatingNode phiUsage : propagateUsages) { propagateDelete(phiUsage);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Wed Dec 16 18:47:48 2015 -0800 @@ -87,8 +87,7 @@ outer: while (true) { for (ProxyNode vpn : proxies().snapshot()) { ValueNode value = vpn.value(); - vpn.replaceAtUsages(value); - vpn.safeDelete(); + vpn.replaceAtUsagesAndDelete(value); if (value == this) { // Guard proxy could have this input as value. continue outer;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Dec 16 18:47:48 2015 -0800 @@ -94,7 +94,7 @@ */ public void replace(StructuredGraph graph, Node replacement) { assert graph == graph(); - graph().replaceFloating(this, replacement); + replaceAtUsagesAndDelete(replacement); } @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java Wed Dec 16 18:47:48 2015 -0800 @@ -488,8 +488,7 @@ LoopExplosionState queryState = new LoopExplosionState(frameState, null); LoopExplosionState existingState = loopScope.iterationStates.get(queryState); if (existingState != null) { - loopBegin.replaceAtUsages(existingState.merge); - loopBegin.safeDelete(); + loopBegin.replaceAtUsagesAndDelete(existingState.merge); successor.safeDelete(); for (EndNode predecessor : predecessors) { existingState.merge.addForwardEnd(predecessor); @@ -499,8 +498,7 @@ } MergeNode merge = methodScope.graph.add(new MergeNode()); - loopBegin.replaceAtUsages(merge); - loopBegin.safeDelete(); + loopBegin.replaceAtUsagesAndDelete(merge); merge.setStateAfter(frameState); merge.setNext(successor); for (EndNode predecessor : predecessors) { @@ -653,7 +651,7 @@ replacement = phi; } - methodScope.graph.replaceFloating(proxy, replacement); + proxy.replaceAtUsagesAndDelete(replacement); } if (merge != null && (merge.stateAfter() == null || phiCreated)) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Wed Dec 16 18:47:48 2015 -0800 @@ -275,8 +275,7 @@ if (usageNodeClass.valueNumberable() && !usageNodeClass.isLeafNode()) { Node newNode = graph().findDuplicate(usage); if (newNode != null) { - usage.replaceAtUsages(newNode); - usage.safeDelete(); + usage.replaceAtUsagesAndDelete(newNode); } } if (usage.isAlive()) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Wed Dec 16 18:47:48 2015 -0800 @@ -267,8 +267,7 @@ } } for (PhiNode phi : phis().filter(((NodePredicate) alive::contains).negate()).snapshot()) { - phi.replaceAtUsages(null); - phi.safeDelete(); + phi.replaceAtUsagesAndDelete(null); } } }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimplifyingGraphDecoder.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimplifyingGraphDecoder.java Wed Dec 16 18:47:48 2015 -0800 @@ -230,8 +230,7 @@ } if (!node.isDeleted()) { GraphUtil.unlinkFixedNode((FixedWithNextNode) node); - node.replaceAtUsages(canonical); - node.safeDelete(); + node.replaceAtUsagesAndDelete(canonical); } assert lookupNode(loopScope, nodeOrderId) == node; registerNode(loopScope, nodeOrderId, canonical, true, false);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Wed Dec 16 18:47:48 2015 -0800 @@ -330,17 +330,6 @@ return hasNode(LoopBeginNode.TYPE); } - public void removeFloating(FloatingNode node) { - assert node != null && node.isAlive() : "cannot remove " + node; - node.safeDelete(); - } - - public void replaceFloating(FloatingNode node, Node replacement) { - assert node != null && node.isAlive() && (replacement == null || replacement.isAlive()) : "cannot replace " + node + " with " + replacement; - node.replaceAtUsages(replacement); - node.safeDelete(); - } - /** * Unlinks a node from all its control flow neighbors and then removes it from its graph. The * node must have no {@linkplain Node#usages() usages}. @@ -381,8 +370,7 @@ public void replaceFixedWithFloating(FixedWithNextNode node, FloatingNode replacement) { assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement; GraphUtil.unlinkFixedNode(node); - node.replaceAtUsages(replacement); - node.safeDelete(); + node.replaceAtUsagesAndDelete(replacement); } public void removeSplit(ControlSplitNode node, AbstractBeginNode survivingSuccessor) { @@ -438,8 +426,7 @@ assert survivingSuccessor != null; node.clearSuccessors(); node.replaceAtPredecessor(survivingSuccessor); - node.replaceAtUsages(replacement); - node.safeDelete(); + node.replaceAtUsagesAndDelete(replacement); } public void addAfterFixed(FixedWithNextNode node, FixedNode newNode) { @@ -480,8 +467,7 @@ for (PhiNode phi : merge.phis().snapshot()) { assert phi.valueCount() == 1; ValueNode singleValue = phi.valueAt(0); - phi.replaceAtUsages(singleValue); - phi.safeDelete(); + phi.replaceAtUsagesAndDelete(singleValue); } // remove loop exits if (merge instanceof LoopBeginNode) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Wed Dec 16 18:47:48 2015 -0800 @@ -100,8 +100,7 @@ ConditionalNode equalValue = graph().unique(new ConditionalNode(equalComp, ConstantNode.forInt(0, graph()), ConstantNode.forInt(1, graph()))); ConditionalNode value = graph().unique(new ConditionalNode(lessComp, ConstantNode.forInt(-1, graph()), equalValue)); - - graph().replaceFloating(this, value); + replaceAtUsagesAndDelete(value); } @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Wed Dec 16 18:47:48 2015 -0800 @@ -223,7 +223,7 @@ if (singleValue != PhiNode.MULTIPLE_VALUES) { Collection<PhiNode> phiUsages = phiNode.usages().filter(PhiNode.class).snapshot(); Collection<ProxyNode> proxyUsages = phiNode.usages().filter(ProxyNode.class).snapshot(); - phiNode.graph().replaceFloating(phiNode, singleValue); + phiNode.replaceAtUsagesAndDelete(singleValue); for (PhiNode phi : phiUsages) { checkRedundantPhi(phi); } @@ -250,7 +250,7 @@ if (vpnValue == v2) { Collection<PhiNode> phiUsages = vpn.usages().filter(PhiNode.class).snapshot(); Collection<ProxyNode> proxyUsages = vpn.usages().filter(ProxyNode.class).snapshot(); - vpn.graph().replaceFloating(vpn, vpnValue); + vpn.replaceAtUsagesAndDelete(vpnValue); for (PhiNode phi : phiUsages) { checkRedundantPhi(phi); }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Wed Dec 16 18:47:48 2015 -0800 @@ -241,8 +241,7 @@ Node newNode = node.graph().findDuplicate(node); if (newNode != null) { assert !(node instanceof FixedNode || newNode instanceof FixedNode); - node.replaceAtUsages(newNode); - node.safeDelete(); + node.replaceAtUsagesAndDelete(newNode); METRIC_GLOBAL_VALUE_NUMBERING_HITS.increment(); Debug.log("GVN applied and new node is %1s", newNode); return true; @@ -333,16 +332,9 @@ canonical = graph.addOrUniqueWithInputs(canonical); } if (node instanceof FloatingNode) { - if (canonical == null) { - // case 1 - node.replaceAtUsages(null); - graph.removeFloating((FloatingNode) node); - } else { - // case 2 - assert !(canonical instanceof FixedNode) || (canonical.predecessor() != null || canonical instanceof StartNode || canonical instanceof AbstractMergeNode) : node + " -> " + - canonical + " : replacement should be floating or fixed and connected"; - graph.replaceFloating((FloatingNode) node, canonical); - } + assert canonical == null || !(canonical instanceof FixedNode) || (canonical.predecessor() != null || canonical instanceof StartNode || canonical instanceof AbstractMergeNode) : node + + " -> " + canonical + " : replacement should be floating or fixed and connected"; + node.replaceAtUsagesAndDelete(canonical); } else { assert node instanceof FixedNode && node.predecessor() != null : node + " -> " + canonical + " : node should be fixed & connected (" + node.predecessor() + ")"; FixedNode fixed = (FixedNode) node;
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Wed Dec 16 18:47:48 2015 -0800 @@ -383,10 +383,10 @@ @Override public void finished() { if (trueConstant.hasNoUsages()) { - graph.removeFloating(trueConstant); + trueConstant.safeDelete(); } if (falseConstant.hasNoUsages()) { - graph.removeFloating(falseConstant); + falseConstant.safeDelete(); } super.finished(); }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Wed Dec 16 18:47:48 2015 -0800 @@ -302,9 +302,8 @@ if (rewireGuards(infoElement.getGuard(), result.toBoolean(), (guard, checkCastResult) -> { if (checkCastResult) { PiNode piNode = node.graph().unique(new PiNode(node.object(), node.stamp(), guard)); - node.replaceAtUsages(piNode); GraphUtil.unlinkFixedNode(node); - node.safeDelete(); + node.replaceAtUsagesAndDelete(piNode); } else { DeoptimizeNode deopt = node.graph().add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode)); node.replaceAtPredecessor(deopt);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/RemoveValueProxyPhase.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/RemoveValueProxyPhase.java Wed Dec 16 18:47:48 2015 -0800 @@ -34,7 +34,7 @@ @Override protected void run(StructuredGraph graph) { for (ProxyNode vpn : graph.getNodes(ProxyNode.TYPE)) { - graph.replaceFloating(vpn, vpn.value()); + vpn.replaceAtUsagesAndDelete(vpn.value()); } for (LoopExitNode exit : graph.getNodes(LoopExitNode.TYPE)) { FrameState stateAfter = exit.stateAfter();
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Wed Dec 16 18:47:48 2015 -0800 @@ -164,7 +164,7 @@ Constant constant = arg.asConstant(); parameterUsages = trackParameterUsages(param, parameterUsages); // collect param usages before replacing the param - graph.replaceFloating(param, ConstantNode.forConstant(arg.stamp(), constant, context.getMetaAccess(), graph)); + param.replaceAtUsagesAndDelete(ConstantNode.forConstant(arg.stamp(), constant, context.getMetaAccess(), graph)); // param-node gone, leaving a gap in the sequence given by param.index() } else { Stamp impro = improvedStamp(arg, param);
--- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64ConvertSnippets.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64ConvertSnippets.java Wed Dec 16 18:47:48 2015 -0800 @@ -190,7 +190,7 @@ SnippetTemplate template = template(args); Debug.log("Lowering %s in %s: node=%s, template=%s, arguments=%s", convert.getFloatConvert(), graph, convert, template, args); template.instantiate(providers.getMetaAccess(), convert, DEFAULT_REPLACER, tool, args); - graph.removeFloating(convert); + convert.safeDelete(); } } }
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/InstanceOfTest.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/InstanceOfTest.java Wed Dec 16 18:47:48 2015 -0800 @@ -63,7 +63,7 @@ InstanceOfNode ion = graph.getNodes().filter(InstanceOfNode.class).first(); if (ion != null) { LogicNode ionNew = graph.unique(InstanceOfNode.create(ion.type(), ion.getValue(), profile)); - graph.replaceFloating(ion, ionNew); + ion.replaceAtUsagesAndDelete(ionNew); } }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Wed Dec 16 18:47:48 2015 -0800 @@ -384,7 +384,7 @@ return; } ValueNode hub = createReadHub(graph, loadHub.getValue(), tool); - graph.replaceFloating(loadHub, hub); + loadHub.replaceAtUsagesAndDelete(hub); } protected void lowerMonitorEnterNode(MonitorEnterNode monitorEnter, LoweringTool tool, StructuredGraph graph) { @@ -631,7 +631,7 @@ for (Node usage : commit.usages().snapshot()) { AllocatedObjectNode addObject = (AllocatedObjectNode) usage; int index = commit.getVirtualObjects().indexOf(addObject.getVirtualObject()); - graph.replaceFloating(addObject, allocations[index]); + addObject.replaceAtUsagesAndDelete(allocations[index]); } }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java Wed Dec 16 18:47:48 2015 -0800 @@ -568,8 +568,7 @@ registerNode(loopScope, invokeData.exceptionOrderId, exceptionValue, true, true); } if (inlineScope.exceptionPlaceholderNode != null) { - inlineScope.exceptionPlaceholderNode.replaceAtUsages(exceptionValue); - inlineScope.exceptionPlaceholderNode.safeDelete(); + inlineScope.exceptionPlaceholderNode.replaceAtUsagesAndDelete(exceptionValue); } deleteInvoke(invoke);
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/IsCompilationConstantNode.java Wed Dec 16 18:46:44 2015 -0800 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/IsCompilationConstantNode.java Wed Dec 16 18:47:48 2015 -0800 @@ -51,7 +51,7 @@ @Override public void lower(LoweringTool tool) { - graph().replaceFloating(this, ConstantNode.forBoolean(false, graph())); + replaceAtUsagesAndDelete(ConstantNode.forBoolean(false, graph())); } @Override