changeset 4305:0768bf0a4898

move part of the cfg-modifying operations into one place (currently: StructuredGraph)
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 17 Jan 2012 11:41:53 +0100
parents f9552a259363
children ff0ac17dc0aa
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/BoxingEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/FloatingReadPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedGuardNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeWithExceptionNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/BoxNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeReadNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeWriteNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/UnboxNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/ValueAnchorNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/NewArrayNode.java
diffstat 16 files changed, 147 insertions(+), 109 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/BoxingEliminationPhase.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/BoxingEliminationPhase.java	Tue Jan 17 11:41:53 2012 +0100
@@ -40,7 +40,7 @@
 
             Map<PhiNode, PhiNode> phiReplacements = new HashMap<>();
             for (UnboxNode unboxNode : graph.getNodes(UnboxNode.class)) {
-                tryEliminate(unboxNode, phiReplacements);
+                tryEliminate(graph, unboxNode, phiReplacements);
             }
 
             new DeadCodeEliminationPhase().apply(graph);
@@ -51,11 +51,12 @@
         }
     }
 
-    private void tryEliminate(UnboxNode unboxNode, Map<PhiNode, PhiNode> phiReplacements) {
+    private void tryEliminate(StructuredGraph graph, UnboxNode unboxNode, Map<PhiNode, PhiNode> phiReplacements) {
         ValueNode unboxedValue = unboxedValue(unboxNode.source(), unboxNode.destinationKind(), phiReplacements);
         if (unboxedValue != null) {
             assert unboxedValue.kind() == unboxNode.destinationKind();
-            unboxNode.replaceAndUnlink(unboxedValue);
+            unboxNode.replaceAtUsages(unboxedValue);
+            graph.removeFixed(unboxNode);
         }
     }
 
@@ -112,13 +113,13 @@
             }
         }
 
+        // TODO(ls) this seems weird: there might still be references to boxNode, yet it is deleted...
+
         FrameState stateAfter = boxNode.stateAfter();
         boxNode.setStateAfter(null);
         stateAfter.safeDelete();
-        FixedNode next = boxNode.next();
-        boxNode.setNext(null);
-        boxNode.replaceAtPredecessors(next);
-        boxNode.safeDelete();
+
+        ((StructuredGraph) boxNode.graph()).removeFixed(boxNode);
     }
 
     private static void virtualizeUsages(ValueNode boxNode, ValueNode replacement, RiResolvedType exactType) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/FloatingReadPhase.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/FloatingReadPhase.java	Tue Jan 17 11:41:53 2012 +0100
@@ -263,9 +263,7 @@
         BeginNode entryPoint = graph.start();
         FixedNode next = entryPoint.next();
         if (!(next instanceof MemoryCheckpoint)) {
-            WriteMemoryCheckpointNode checkpoint = graph.add(new WriteMemoryCheckpointNode());
-            entryPoint.setNext(checkpoint);
-            checkpoint.setNext(next);
+            graph.addAfterFixed(entryPoint, graph.add(new WriteMemoryCheckpointNode()));
         }
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java	Tue Jan 17 11:41:53 2012 +0100
@@ -155,8 +155,7 @@
             IsTypeNode isType = graph.unique(new IsTypeNode(invoke.callTarget().receiver(), type));
             FixedGuardNode guard = graph.add(new FixedGuardNode(isType));
             assert invoke.predecessor() != null;
-            invoke.predecessor().replaceFirstSuccessor(invoke.node(), guard);
-            guard.setNext(invoke.node());
+            graph.addBeforeFixed(invoke.node(), guard);
 
             if (GraalOptions.TraceInlining) {
                 TTY.println("inlining with type check, type probability: %5.3f", probability);
--- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java	Tue Jan 17 11:41:53 2012 +0100
@@ -208,25 +208,20 @@
         if (n instanceof ArrayLengthNode) {
             ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n;
             SafeReadNode safeReadArrayLength = safeReadArrayLength(arrayLengthNode.graph(), arrayLengthNode.array());
-            FixedNode nextNode = arrayLengthNode.next();
-            arrayLengthNode.clearSuccessors();
-            safeReadArrayLength.setNext(nextNode);
-            arrayLengthNode.replaceAndDelete(safeReadArrayLength);
+            StructuredGraph graph = (StructuredGraph) arrayLengthNode.graph();
+            graph.replaceFixedWithFixed(arrayLengthNode, safeReadArrayLength);
             safeReadArrayLength.lower(tool);
         } else if (n instanceof LoadFieldNode) {
             LoadFieldNode field = (LoadFieldNode) n;
             if (field.isVolatile()) {
                 return;
             }
-            Graph graph = field.graph();
+            StructuredGraph graph = (StructuredGraph) field.graph();
             int displacement = ((HotSpotField) field.field()).offset();
             assert field.kind() != CiKind.Illegal;
             ReadNode memoryRead = graph.unique(new ReadNode(field.field().kind(true).stackKind(), field.object(), LocationNode.create(field.field(), field.field().kind(true), displacement, graph)));
             memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(field.object(), false))));
-            FixedNode next = field.next();
-            field.setNext(null);
-            memoryRead.setNext(next);
-            field.replaceAndDelete(memoryRead);
+            graph.replaceFixedWithFixed(field, memoryRead);
         } else if (n instanceof StoreFieldNode) {
             StoreFieldNode field = (StoreFieldNode) n;
             if (field.isVolatile()) {
@@ -249,17 +244,14 @@
             field.replaceAndDelete(memoryWrite);
         } else if (n instanceof LoadIndexedNode) {
             LoadIndexedNode loadIndexed = (LoadIndexedNode) n;
-            Graph graph = loadIndexed.graph();
+            StructuredGraph graph = (StructuredGraph) loadIndexed.graph();
             GuardNode boundsCheck = createBoundsCheck(loadIndexed, tool);
 
             CiKind elementKind = loadIndexed.elementKind();
             LocationNode arrayLocation = createArrayLocation(graph, elementKind, loadIndexed.index());
             ReadNode memoryRead = graph.unique(new ReadNode(elementKind.stackKind(), loadIndexed.array(), arrayLocation));
             memoryRead.setGuard(boundsCheck);
-            FixedNode next = loadIndexed.next();
-            loadIndexed.setNext(null);
-            memoryRead.setNext(next);
-            loadIndexed.replaceAndDelete(memoryRead);
+            graph.replaceFixedWithFixed(loadIndexed, memoryRead);
         } else if (n instanceof StoreIndexedNode) {
             StoreIndexedNode storeIndexed = (StoreIndexedNode) n;
             Graph graph = storeIndexed.graph();
@@ -309,30 +301,23 @@
             storeIndexed.safeDelete();
         } else if (n instanceof UnsafeLoadNode) {
             UnsafeLoadNode load = (UnsafeLoadNode) n;
-            Graph graph = load.graph();
+            StructuredGraph graph = (StructuredGraph) load.graph();
             assert load.kind() != CiKind.Illegal;
             IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, load.loadKind(), load.displacement(), load.offset(), graph);
             location.setIndexScalingEnabled(false);
             ReadNode memoryRead = graph.unique(new ReadNode(load.kind(), load.object(), location));
             memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(load.object(), false))));
-            FixedNode next = load.next();
-            load.setNext(null);
-            memoryRead.setNext(next);
-            load.replaceAndDelete(memoryRead);
+            graph.replaceFixedWithFixed(load, memoryRead);
         } else if (n instanceof UnsafeStoreNode) {
             UnsafeStoreNode store = (UnsafeStoreNode) n;
-            Graph graph = store.graph();
+            StructuredGraph graph = (StructuredGraph) store.graph();
             IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, store.storeKind(), store.displacement(), store.offset(), graph);
             location.setIndexScalingEnabled(false);
             WriteNode write = graph.add(new WriteNode(store.object(), store.value(), location));
             FieldWriteBarrier barrier = graph.add(new FieldWriteBarrier(store.object()));
-            FixedNode next = store.next();
-            store.setNext(null);
-            barrier.setNext(next);
-            write.setNext(barrier);
             write.setStateAfter(store.stateAfter());
-            store.replaceAtPredecessors(write);
-            store.safeDelete();
+            graph.replaceFixedWithFixed(store, write);
+            graph.addBeforeFixed(write, barrier);
         } else if (n instanceof ArrayHeaderSizeNode) {
             n.replaceAndDelete(ConstantNode.forLong(config.getArrayOffset(((ArrayHeaderSizeNode) n).elementKind()), n.graph()));
         }
--- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java	Tue Jan 17 11:41:53 2012 +0100
@@ -611,10 +611,9 @@
             probability = 0.5;
         }
 
-        IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new CompareNode(x, cond, y)), probability));
-        append(ifNode);
-        ifNode.setTrueSuccessor(BeginNode.begin(createTarget(currentBlock.successors.get(0), frameState)));
-        ifNode.setFalseSuccessor(BeginNode.begin(createTarget(currentBlock.successors.get(1), frameState)));
+        FixedNode trueSuccessor = createTarget(currentBlock.successors.get(0), frameState);
+        FixedNode falseSuccessor = createTarget(currentBlock.successors.get(1), frameState);
+        append(currentGraph.add(new IfNode(currentGraph.unique(new CompareNode(x, cond, y)), trueSuccessor, falseSuccessor, probability)));
 
         assert currentBlock.normalSuccessors == 2 : currentBlock.normalSuccessors;
     }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedGuardNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedGuardNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -78,12 +78,9 @@
     @Override
     public void lower(CiLoweringTool tool) {
         AnchorNode newAnchor = graph().add(new AnchorNode());
-        FixedNode next = this.next();
-        this.setNext(null);
-        newAnchor.setNext(next);
         for (BooleanNode b : conditions) {
             newAnchor.addGuard((GuardNode) tool.createGuard(b));
         }
-        this.replaceAndDelete(newAnchor);
+        ((StructuredGraph) graph()).replaceFixedWithFixed(this, newAnchor);
     }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -22,7 +22,6 @@
  */
 package com.oracle.max.graal.nodes;
 
-import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.nodes.type.*;
 
 /**
@@ -44,19 +43,4 @@
     public FixedWithNextNode(Stamp stamp) {
         super(stamp);
     }
-
-    public void replaceAndUnlink(Node other) {
-        FixedNode tmpNext = this.next();
-        setNext(null);
-        replaceAtPredecessors(tmpNext);
-        replaceAtUsages(other);
-        safeDelete();
-    }
-
-    public void replaceWithFixedWithNext(FixedWithNextNode other) {
-        FixedNode tmpNext = this.next();
-        setNext(null);
-        other.setNext(tmpNext);
-        replaceAndDelete(other);
-    }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -26,7 +26,6 @@
 
 import com.oracle.max.cri.ci.*;
 import com.oracle.max.graal.graph.*;
-import com.oracle.max.graal.nodes.calc.*;
 import com.oracle.max.graal.nodes.extended.*;
 import com.oracle.max.graal.nodes.java.*;
 import com.oracle.max.graal.nodes.spi.*;
@@ -106,18 +105,11 @@
                 stateAfter().delete();
             }
         }
-        if (node instanceof FixedWithNextNode) {
-            FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node;
-            FixedNode next = this.next();
-            setNext(null);
-            fixedWithNextNode.setNext(next);
-            this.replaceAndDelete(node);
-        } else if (node instanceof FloatingNode || (node == null && this.kind() == CiKind.Void)) {
-            FixedNode next = this.next();
-            setNext(null);
-            this.replaceAtPredecessors(next);
-            this.replaceAtUsages(node);
-            this.safeDelete();
+        if (node == null) {
+            assert kind() == CiKind.Void && usages().isEmpty();
+            ((StructuredGraph) graph()).removeFixed(this);
+        } else {
+            ((StructuredGraph) graph()).replaceFixed(this, node);
         }
     }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeWithExceptionNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeWithExceptionNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -26,7 +26,6 @@
 
 import com.oracle.max.cri.ci.*;
 import com.oracle.max.graal.graph.*;
-import com.oracle.max.graal.nodes.calc.*;
 import com.oracle.max.graal.nodes.extended.*;
 import com.oracle.max.graal.nodes.java.*;
 import com.oracle.max.graal.nodes.spi.*;
@@ -151,21 +150,11 @@
                 stateAfter().delete();
             }
         }
-
-        if (node instanceof FixedWithNextNode) {
-            FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node;
-            FixedNode next = this.next();
-            setNext(null);
-            fixedWithNextNode.setNext(next);
-            this.replaceAndDelete(node);
-        } else if (node instanceof FloatingNode || (node == null && this.kind() == CiKind.Void)) {
-            FixedNode next = this.next();
-            setNext(null);
-            this.replaceAtPredecessors(next);
-            this.replaceAtUsages(node);
-            this.delete();
+        if (node == null) {
+            assert kind() == CiKind.Void && usages().isEmpty();
+            ((StructuredGraph) graph()).removeSplit(this, NORMAL_EDGE);
         } else {
-            assert false : node;
+            ((StructuredGraph) graph()).replaceSplit(this, node, NORMAL_EDGE);
         }
     }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java	Tue Jan 17 11:41:53 2012 +0100
@@ -26,6 +26,7 @@
 
 import com.oracle.max.cri.ri.*;
 import com.oracle.max.graal.graph.*;
+import com.oracle.max.graal.nodes.calc.*;
 import com.oracle.max.graal.nodes.java.*;
 
 
@@ -138,4 +139,105 @@
     public boolean hasLoops() {
         return getNodes(LoopBeginNode.class).iterator().hasNext();
     }
+
+
+
+    public void removeFixed(FixedWithNextNode node) {
+        assert node != null;
+        assert node.usages().isEmpty();
+        FixedNode next = node.next();
+        node.setNext(null);
+        node.replaceAtPredecessors(next);
+        node.safeDelete();
+    }
+
+    public void replaceFixed(FixedWithNextNode node, Node replacement) {
+        if (replacement instanceof FixedWithNextNode) {
+            replaceFixedWithFixed(node, (FixedWithNextNode) replacement);
+        } else {
+            assert replacement != null : "cannot replace " + node + " with null";
+            assert replacement instanceof FloatingNode : "cannot replace " + node + " with " + replacement;
+            replaceFixedWithFloating(node, (FloatingNode) replacement);
+        }
+    }
+
+    public void replaceFixedWithFixed(FixedWithNextNode node, FixedWithNextNode replacement) {
+        assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement;
+        FixedNode next = node.next();
+        node.setNext(null);
+        replacement.setNext(next);
+        node.replaceAndDelete(replacement);
+    }
+
+    public void replaceFixedWithFloating(FixedWithNextNode node, FloatingNode replacement) {
+        assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement;
+        FixedNode next = node.next();
+        node.setNext(null);
+        node.replaceAtPredecessors(next);
+        node.replaceAtUsages(replacement);
+        node.safeDelete();
+    }
+
+    public void removeSplit(ControlSplitNode node, int survivingSuccessor) {
+        assert node != null;
+        assert node.usages().isEmpty();
+        assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
+        FixedNode next = node.blockSuccessor(survivingSuccessor);
+        for (int i = 0; i < node.blockSuccessorCount(); i++) {
+            node.setBlockSuccessor(i, null);
+        }
+        node.replaceAtPredecessors(next);
+        node.safeDelete();
+    }
+
+    public void replaceSplit(ControlSplitNode node, Node replacement, int survivingSuccessor) {
+        if (replacement instanceof FixedWithNextNode) {
+            replaceSplitWithFixed(node, (FixedWithNextNode) replacement, survivingSuccessor);
+        } else {
+            assert replacement != null : "cannot replace " + node + " with null";
+            assert replacement instanceof FloatingNode : "cannot replace " + node + " with " + replacement;
+            replaceSplitWithFloating(node, (FloatingNode) replacement, survivingSuccessor);
+        }
+    }
+
+    public void replaceSplitWithFixed(ControlSplitNode node, FixedWithNextNode replacement, int survivingSuccessor) {
+        assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement;
+        assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
+        FixedNode next = node.blockSuccessor(survivingSuccessor);
+        for (int i = 0; i < node.blockSuccessorCount(); i++) {
+            node.setBlockSuccessor(i, null);
+        }
+        replacement.setNext(next);
+        node.replaceAndDelete(replacement);
+    }
+
+    public void replaceSplitWithFloating(ControlSplitNode node, FloatingNode replacement, int survivingSuccessor) {
+        assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement;
+        assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
+        FixedNode next = node.blockSuccessor(survivingSuccessor);
+        for (int i = 0; i < node.blockSuccessorCount(); i++) {
+            node.setBlockSuccessor(i, null);
+        }
+        node.replaceAtPredecessors(next);
+        node.replaceAtUsages(replacement);
+        node.safeDelete();
+    }
+
+    public void addAfterFixed(FixedWithNextNode node, FixedWithNextNode newNode) {
+        assert node != null && newNode != null && node.isAlive() && newNode.isAlive() : "cannot add " + newNode + " after " + node;
+        assert newNode.next() == null;
+        FixedNode next = node.next();
+        node.setNext(newNode);
+        newNode.setNext(next);
+    }
+
+    public void addBeforeFixed(FixedNode node, FixedWithNextNode newNode) {
+        assert node != null && newNode != null && node.isAlive() && newNode.isAlive() : "cannot add " + newNode + " before " + node;
+        assert node.predecessor() != null && node.predecessor() instanceof FixedWithNextNode : "cannot add " + newNode + " before " + node;
+        assert newNode.next() == null;
+        FixedWithNextNode pred = (FixedWithNextNode) node.predecessor();
+        pred.setNext(newNode);
+        newNode.setNext(node);
+    }
+
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/BoxNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/BoxNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -60,6 +60,6 @@
         InvokeNode invokeNode = graph().add(new InvokeNode(callTarget, bci));
         invokeNode.setProbability(this.probability());
         invokeNode.setStateAfter(stateAfter());
-        this.replaceWithFixedWithNext(invokeNode);
+        ((StructuredGraph) graph()).replaceFixedWithFixed(this, invokeNode);
     }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeReadNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeReadNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -24,7 +24,6 @@
 
 import com.oracle.max.cri.ci.*;
 import com.oracle.max.graal.cri.*;
-import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.nodes.*;
 import com.oracle.max.graal.nodes.calc.*;
 import com.oracle.max.graal.nodes.spi.*;
@@ -39,13 +38,11 @@
 
     @Override
     public void lower(CiLoweringTool tool) {
-        Graph graph = graph();
+        StructuredGraph graph = (StructuredGraph) graph();
         GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false)));
         ReadNode read = graph.unique(new ReadNode(kind(), object(), location()));
         read.setGuard(guard);
-        FixedNode next = this.next();
-        this.setNext(null);
-        read.setNext(next);
-        this.replaceAndDelete(read);
+
+        graph.replaceFixedWithFixed(this, read);
     }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeWriteNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeWriteNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -24,7 +24,6 @@
 
 import com.oracle.max.cri.ci.*;
 import com.oracle.max.graal.cri.*;
-import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.nodes.*;
 import com.oracle.max.graal.nodes.calc.*;
 import com.oracle.max.graal.nodes.spi.*;
@@ -45,13 +44,10 @@
 
     @Override
     public void lower(CiLoweringTool tool) {
-        Graph graph = graph();
+        StructuredGraph graph = (StructuredGraph) graph();
         GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false)));
         WriteNode write = graph.add(new WriteNode(object(), value(), location()));
         write.setGuard(guard);
-        FixedNode next = this.next();
-        this.setNext(null);
-        write.setNext(next);
-        this.replaceAndDelete(write);
+        graph.replaceFixedWithFixed(this, write);
     }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/UnboxNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/UnboxNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -54,7 +54,7 @@
         RiResolvedField field = pool.getBoxField(kind());
         LoadFieldNode loadField = graph().add(new LoadFieldNode(source, field));
         loadField.setProbability(probability());
-        this.replaceWithFixedWithNext(loadField);
+        ((StructuredGraph) graph()).replaceFixedWithFixed(this, loadField);
     }
 
     @Override
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/ValueAnchorNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/ValueAnchorNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -33,7 +33,7 @@
  * The ValueAnchor instruction keeps non-CFG (floating) nodes above a certain point in the graph.
  */
 
-public final class ValueAnchorNode extends FixedWithNextNode implements Canonicalizable, LIRLowerable {
+public final class ValueAnchorNode extends FixedWithNextNode implements Canonicalizable, LIRLowerable, Node.IterableNodeType {
 
     @Input private ValueNode object;
 
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/NewArrayNode.java	Mon Jan 16 10:59:54 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/NewArrayNode.java	Tue Jan 17 11:41:53 2012 +0100
@@ -110,10 +110,9 @@
         public void beforeUpdate(Node node, Node usage) {
             if (usage instanceof ArrayLengthNode) {
                 ArrayLengthNode x = (ArrayLengthNode) usage;
-                FixedNode next = x.next();
-                x.setNext(null);
-                x.replaceAtPredecessors(next);
-                x.replaceAndDelete(((NewArrayNode) node).dimension(0));
+                StructuredGraph graph = (StructuredGraph) node.graph();
+                node.replaceAtUsages(((NewArrayNode) node).dimension(0));
+                graph.removeFixed(x);
             } else {
                 super.beforeUpdate(node, usage);
             }