changeset 23197:a4793f630f4c

Avoid notifying about nodes that are about to be deleted
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Wed, 16 Dec 2015 18:47:48 -0800
parents 6af2a84b8f4c
children 3da033dc955b
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimplifyingGraphDecoder.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/RemoveValueProxyPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64ConvertSnippets.java graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/InstanceOfTest.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/IsCompilationConstantNode.java
diffstat 23 files changed, 58 insertions(+), 71 deletions(-) [+]
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