# HG changeset patch # User Lukas Stadler # Date 1326796913 -3600 # Node ID 0768bf0a4898a7d3a1ad58f51d777991147afa16 # Parent f9552a2593635c94bc7e80cf84b71d2005f9c437 move part of the cfg-modifying operations into one place (currently: StructuredGraph) diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/BoxingEliminationPhase.java --- 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 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 phiReplacements) { + private void tryEliminate(StructuredGraph graph, UnboxNode unboxNode, Map 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) { diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/FloatingReadPhase.java --- 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())); } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java --- 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); diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java --- 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())); } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java --- 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; } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedGuardNode.java --- 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); } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java --- 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); - } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeNode.java --- 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); } } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/InvokeWithExceptionNode.java --- 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); } } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java --- 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); + } + } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/BoxNode.java --- 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); } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeReadNode.java --- 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); } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/SafeWriteNode.java --- 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); } } diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/UnboxNode.java --- 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 diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/extended/ValueAnchorNode.java --- 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; diff -r f9552a259363 -r 0768bf0a4898 graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/NewArrayNode.java --- 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); }