# HG changeset patch # User Gilles Duboscq # Date 1368203310 -7200 # Node ID 183d33c76419d2bf9b7f62f96c127c130332d885 # Parent 37e9968557629d3ef6cb96567a06bbec3438bc71 Removed ValueNode.dependencies Introduced GuardedNode and GuardingNode interfaces diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri May 10 18:28:30 2013 +0200 @@ -754,7 +754,7 @@ ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n; ValueNode array = arrayLengthNode.array(); ReadNode arrayLengthRead = graph.add(new ReadNode(array, ConstantLocationNode.create(LocationNode.FINAL_LOCATION, Kind.Int, config.arrayLengthOffset, graph), StampFactory.positiveInt())); - tool.createNullCheckGuard(arrayLengthRead.dependencies(), array); + tool.createNullCheckGuard(arrayLengthRead, array); graph.replaceFixedWithFixed(arrayLengthNode, arrayLengthRead); } else if (n instanceof Invoke) { Invoke invoke = (Invoke) n; @@ -763,7 +763,7 @@ NodeInputList parameters = callTarget.arguments(); ValueNode receiver = parameters.size() <= 0 ? null : parameters.get(0); if (!callTarget.isStatic() && receiver.kind() == Kind.Object && !receiver.objectStamp().nonNull()) { - tool.createNullCheckGuard(invoke.asNode().dependencies(), receiver); + tool.createNullCheckGuard(invoke, receiver); } JavaType[] signature = MetaUtil.signatureToTypes(callTarget.targetMethod().getSignature(), callTarget.isStatic() ? null : callTarget.targetMethod().getDeclaringClass()); @@ -805,7 +805,7 @@ ValueNode object = loadField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : loadField.object(); assert loadField.kind() != Kind.Illegal; ReadNode memoryRead = graph.add(new ReadNode(object, createFieldLocation(graph, field), loadField.stamp())); - tool.createNullCheckGuard(memoryRead.dependencies(), object); + tool.createNullCheckGuard(memoryRead, object); graph.replaceFixedWithFixed(loadField, memoryRead); @@ -821,7 +821,7 @@ ValueNode object = storeField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : storeField.object(); WriteBarrierType barrierType = getFieldStoreBarrierType(storeField); WriteNode memoryWrite = graph.add(new WriteNode(object, storeField.value(), createFieldLocation(graph, field), barrierType)); - tool.createNullCheckGuard(memoryWrite.dependencies(), object); + tool.createNullCheckGuard(memoryWrite, object); memoryWrite.setStateAfter(storeField.stateAfter()); graph.replaceFixedWithFixed(storeField, memoryWrite); FixedWithNextNode last = memoryWrite; @@ -841,15 +841,15 @@ cas.setWriteBarrierType(getCompareAndSwapBarrier(cas)); } else if (n instanceof LoadIndexedNode) { LoadIndexedNode loadIndexed = (LoadIndexedNode) n; - ValueNode boundsCheck = createBoundsCheck(loadIndexed, tool); + GuardingNode boundsCheck = createBoundsCheck(loadIndexed, tool); Kind elementKind = loadIndexed.elementKind(); LocationNode arrayLocation = createArrayLocation(graph, elementKind, loadIndexed.index()); ReadNode memoryRead = graph.add(new ReadNode(loadIndexed.array(), arrayLocation, loadIndexed.stamp())); - memoryRead.dependencies().add(boundsCheck); + memoryRead.setGuard(boundsCheck); graph.replaceFixedWithFixed(loadIndexed, memoryRead); } else if (n instanceof StoreIndexedNode) { StoreIndexedNode storeIndexed = (StoreIndexedNode) n; - ValueNode boundsCheck = createBoundsCheck(storeIndexed, tool); + GuardingNode boundsCheck = createBoundsCheck(storeIndexed, tool); Kind elementKind = storeIndexed.elementKind(); LocationNode arrayLocation = createArrayLocation(graph, elementKind, storeIndexed.index()); ValueNode value = storeIndexed.value(); @@ -876,7 +876,7 @@ } WriteBarrierType barrierType = getArrayStoreBarrierType(storeIndexed); WriteNode memoryWrite = graph.add(new WriteNode(array, value, arrayLocation, barrierType)); - memoryWrite.dependencies().add(boundsCheck); + memoryWrite.setGuard(boundsCheck); memoryWrite.setStateAfter(storeIndexed.stateAfter()); graph.replaceFixedWithFixed(storeIndexed, memoryWrite); @@ -887,7 +887,7 @@ ReadNode memoryRead = graph.add(new ReadNode(load.object(), location, load.stamp())); // An unsafe read must not floating outside its block as may float above an explicit // null check on its object. - memoryRead.dependencies().add(AbstractBeginNode.prevBegin(load)); + memoryRead.setGuard(AbstractBeginNode.prevBegin(load)); graph.replaceFixedWithFixed(load, memoryRead); } else if (n instanceof UnsafeStoreNode) { UnsafeStoreNode store = (UnsafeStoreNode) n; @@ -910,7 +910,7 @@ graph.replaceFixed(loadMethodNode, metaspaceMethod); } else if (n instanceof FixedGuardNode) { FixedGuardNode node = (FixedGuardNode) n; - ValueAnchorNode newAnchor = graph.add(new ValueAnchorNode(tool.createGuard(node.condition(), node.getReason(), node.getAction(), node.isNegated()))); + ValueAnchorNode newAnchor = graph.add(new ValueAnchorNode(tool.createGuard(node.condition(), node.getReason(), node.getAction(), node.isNegated()).asNode())); graph.replaceFixedWithFixed(node, newAnchor); } else if (n instanceof CommitAllocationNode) { CommitAllocationNode commit = (CommitAllocationNode) n; @@ -1062,7 +1062,7 @@ LocationNode location = ConstantLocationNode.create(LocationNode.FINAL_LOCATION, wordKind, config.hubOffset, graph); assert !object.isConstant() || object.asConstant().isNull(); ReadNode hub = graph.add(new ReadNode(object, location, StampFactory.forKind(wordKind()))); - tool.createNullCheckGuard(hub.dependencies(), object); + tool.createNullCheckGuard(hub, object); return hub; } @@ -1117,10 +1117,10 @@ return IndexedLocationNode.create(LocationNode.getArrayLocation(elementKind), elementKind, getArrayBaseOffset(elementKind), index, graph, scale); } - private static ValueNode createBoundsCheck(AccessIndexedNode n, LoweringTool tool) { + private static GuardingNode createBoundsCheck(AccessIndexedNode n, LoweringTool tool) { StructuredGraph graph = n.graph(); ArrayLengthNode arrayLength = graph.add(new ArrayLengthNode(n.array())); - ValueNode guard = tool.createGuard(graph.unique(new IntegerBelowThanNode(n.index(), arrayLength)), BoundsCheckException, InvalidateReprofile); + GuardingNode guard = tool.createGuard(graph.unique(new IntegerBelowThanNode(n.index(), arrayLength)), BoundsCheckException, InvalidateReprofile); graph.addBeforeFixed(n, arrayLength); return guard; diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java Fri May 10 18:28:30 2013 +0200 @@ -30,6 +30,7 @@ import com.oracle.graal.loop.InductionVariable.Direction; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; public class CountedLoopInfo { @@ -125,12 +126,12 @@ return iv.direction(); } - public ValueNode getOverFlowGuard() { + public GuardingNode getOverFlowGuard() { return loop.loopBegin().getOverflowGuard(); } - public ValueNode createOverFlowGuard() { - ValueNode overflowGuard = getOverFlowGuard(); + public GuardingNode createOverFlowGuard() { + GuardingNode overflowGuard = getOverFlowGuard(); if (overflowGuard != null) { return overflowGuard; } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Fri May 10 18:28:30 2013 +0200 @@ -28,10 +28,11 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -public abstract class AbstractBeginNode extends FixedWithNextNode implements StateSplit, LIRLowerable, Simplifiable, Node.IterableNodeType { +public abstract class AbstractBeginNode extends FixedWithNextNode implements StateSplit, LIRLowerable, Simplifiable, Node.IterableNodeType, GuardingNode { @Input(notDataflow = true) private FrameState stateAfter; @@ -184,4 +185,9 @@ throw new UnsupportedOperationException(); } } + + @Override + public AbstractBeginNode asNode() { + return this; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes; -import java.util.*; - import com.oracle.graal.nodes.type.*; public abstract class DeoptimizingFixedWithNextNode extends FixedWithNextNode implements DeoptimizingNode { @@ -34,14 +32,6 @@ super(stamp); } - public DeoptimizingFixedWithNextNode(Stamp stamp, List dependencies) { - super(stamp, dependencies); - } - - public DeoptimizingFixedWithNextNode(Stamp stamp, ValueNode... dependencies) { - super(stamp, dependencies); - } - @Override public FrameState getDeoptimizationState() { return deoptState; diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes; -import java.util.*; - import com.oracle.graal.nodes.type.*; public abstract class FixedNode extends ValueNode { @@ -32,14 +30,6 @@ super(stamp); } - public FixedNode(Stamp stamp, List dependencies) { - super(stamp, dependencies); - } - - public FixedNode(Stamp stamp, ValueNode... dependencies) { - super(stamp, dependencies); - } - @Override public boolean verify() { assertTrue(this.successors().isNotEmpty() || this.predecessor() != null, "FixedNode should not float"); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedWithNextNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedWithNextNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedWithNextNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes; -import java.util.*; - import com.oracle.graal.nodes.type.*; /** @@ -44,12 +42,4 @@ public FixedWithNextNode(Stamp stamp) { super(stamp); } - - public FixedWithNextNode(Stamp stamp, List dependencies) { - super(stamp, dependencies); - } - - public FixedWithNextNode(Stamp stamp, ValueNode... dependencies) { - super(stamp, dependencies); - } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FloatingGuardedNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FloatingGuardedNode.java Fri May 10 18:28:30 2013 +0200 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes; + +import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.type.*; + +public abstract class FloatingGuardedNode extends FloatingNode implements GuardedNode { + + @Input private GuardingNode guard; + + public FloatingGuardedNode(Stamp stamp) { + super(stamp); + } + + public FloatingGuardedNode(Stamp stamp, GuardingNode guard) { + super(stamp); + this.guard = guard; + } + + @Override + public GuardingNode getGuard() { + return guard; + } + + @Override + public void setGuard(GuardingNode guard) { + updateUsages(this.guard == null ? null : this.guard.asNode(), guard == null ? null : guard.asNode()); + this.guard = guard; + } + + @Override + public FloatingNode asNode() { + return this; + } + +} diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Fri May 10 18:28:30 2013 +0200 @@ -25,7 +25,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; -import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -42,14 +42,14 @@ * control flow would have reached the guarded node (without taking exceptions into account). */ @NodeInfo(nameTemplate = "Guard(!={p#negated}) {p#reason/s}") -public final class GuardNode extends FloatingNode implements Canonicalizable, Node.IterableNodeType, Negatable { +public final class GuardNode extends FloatingGuardedNode implements Canonicalizable, Node.IterableNodeType, Negatable, GuardingNode, GuardedNode { @Input private LogicNode condition; private final DeoptimizationReason reason; private final DeoptimizationAction action; private boolean negated; - public GuardNode(LogicNode condition, FixedNode anchor, DeoptimizationReason reason, DeoptimizationAction action, boolean negated) { + public GuardNode(LogicNode condition, GuardingNode anchor, DeoptimizationReason reason, DeoptimizationAction action, boolean negated) { super(StampFactory.dependency(), anchor); this.condition = condition; this.reason = reason; @@ -95,9 +95,7 @@ if (condition() instanceof LogicConstantNode) { LogicConstantNode c = (LogicConstantNode) condition(); if (c.getValue() != negated) { - if (dependencies().size() == 1) { - return dependencies().get(0); - } + return getGuard().asNode(); } } return this; diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java Fri May 10 18:28:30 2013 +0200 @@ -23,9 +23,10 @@ package com.oracle.graal.nodes; import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; -public interface Invoke extends StateSplit, Lowerable, DeoptimizingNode { +public interface Invoke extends StateSplit, Lowerable, DeoptimizingNode, GuardedNode { FixedNode next(); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Fri May 10 18:28:30 2013 +0200 @@ -39,6 +39,7 @@ @Input private final CallTargetNode callTarget; @Input private FrameState deoptState; + @Input private GuardingNode guard; private final int bci; private boolean polymorphic; private boolean useForInlining; @@ -188,4 +189,15 @@ public boolean isCallSiteDeoptimization() { return true; } + + @Override + public GuardingNode getGuard() { + return guard; + } + + @Override + public void setGuard(GuardingNode guard) { + updateUsages(this.guard == null ? null : this.guard.asNode(), guard == null ? null : guard.asNode()); + this.guard = guard; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Fri May 10 18:28:30 2013 +0200 @@ -40,6 +40,7 @@ @Input private final CallTargetNode callTarget; @Input private FrameState deoptState; @Input private FrameState stateAfter; + @Input private GuardingNode guard; private final int bci; private boolean polymorphic; private boolean useForInlining; @@ -239,4 +240,15 @@ public boolean isCallSiteDeoptimization() { return true; } + + @Override + public GuardingNode getGuard() { + return guard; + } + + @Override + public void setGuard(GuardingNode guard) { + updateUsages(this.guard == null ? null : this.guard.asNode(), guard == null ? null : guard.asNode()); + this.guard = guard; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicNode.java Fri May 10 18:28:30 2013 +0200 @@ -29,8 +29,8 @@ public abstract class LogicNode extends FloatingNode { - public LogicNode(ValueNode... dependencies) { - super(StampFactory.condition(), dependencies); + public LogicNode() { + super(StampFactory.condition()); } /** diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Fri May 10 18:28:30 2013 +0200 @@ -28,6 +28,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; public class LoopBeginNode extends MergeNode implements Node.IterableNodeType, LIRLowerable { @@ -35,7 +36,7 @@ private double loopFrequency; private int nextEndIndex; private int unswitches; - @Input private ValueNode overflowGuard; + @Input private GuardingNode overflowGuard; public LoopBeginNode() { loopFrequency = 1; @@ -185,12 +186,12 @@ } } - public ValueNode getOverflowGuard() { + public GuardingNode getOverflowGuard() { return overflowGuard; } - public void setOverflowGuard(ValueNode overflowGuard) { - updateUsages(this.overflowGuard, overflowGuard); + public void setOverflowGuard(GuardingNode overflowGuard) { + updateUsages(this.overflowGuard == null ? null : this.overflowGuard.asNode(), overflowGuard == null ? null : overflowGuard.asNode()); this.overflowGuard = overflowGuard; } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Fri May 10 18:28:30 2013 +0200 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -33,7 +34,7 @@ * variable. */ @NodeInfo(nameTemplate = "{p#type/s}Phi({i#values})") -public final class PhiNode extends FloatingNode implements Canonicalizable, Node.IterableNodeType { +public final class PhiNode extends FloatingNode implements Canonicalizable, Node.IterableNodeType, GuardingNode { public static enum PhiType { Value(null), // normal value phis @@ -251,4 +252,9 @@ public boolean isLoopPhi() { return merge() instanceof LoopBeginNode; } + + @Override + public PhiNode asNode() { + return this; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Fri May 10 18:28:30 2013 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes; import com.oracle.graal.graph.*; -import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -31,9 +30,10 @@ * A node that changes the type of its input, usually narrowing it. For example, a PI node refines * the type of a receiver during type-guarded inlining to be the type tested by the guard. */ -public class PiNode extends FloatingNode implements LIRLowerable, Virtualizable, Node.IterableNodeType { +public class PiNode extends FloatingGuardedNode implements LIRLowerable, Virtualizable, Node.IterableNodeType { @Input private ValueNode object; + @Input private FixedNode anchor; public ValueNode object() { return object; @@ -44,10 +44,10 @@ this.object = object; } - public PiNode(ValueNode object, Stamp stamp, ValueNode anchor) { - super(stamp, anchor); - assert anchor instanceof FixedNode; + public PiNode(ValueNode object, Stamp stamp, FixedNode anchor) { + super(stamp); this.object = object; + this.anchor = anchor; } @Override diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes; -import java.util.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; @@ -42,28 +40,8 @@ */ private Stamp stamp; - @Input(notDataflow = true) private final NodeInputList dependencies; - - /** - * This collection keeps dependencies that should be observed while scheduling (guards, etc.). - */ - public NodeInputList dependencies() { - return dependencies; - } - public ValueNode(Stamp stamp) { this.stamp = stamp; - this.dependencies = new NodeInputList<>(this); - } - - public ValueNode(Stamp stamp, ValueNode... dependencies) { - this.stamp = stamp; - this.dependencies = new NodeInputList<>(this, dependencies); - } - - public ValueNode(Stamp stamp, List dependencies) { - this.stamp = stamp; - this.dependencies = new NodeInputList<>(this, dependencies); } public Stamp stamp() { @@ -177,17 +155,4 @@ assertTrue(kind() == kind().getStackKind(), "Should have a stack kind : %s", kind()); return super.verify(); } - - @Override - public Map getDebugProperties(Map map) { - Map properties = super.getDebugProperties(map); - if (!dependencies.isEmpty()) { - StringBuilder str = new StringBuilder(); - for (int i = 0; i < dependencies.size(); i++) { - str.append(i == 0 ? "" : ", ").append(dependencies.get(i) == null ? "null" : dependencies.get(i).toString(Verbosity.Id)); - } - properties.put("dependencies", str.toString()); - } - return properties; - } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatingNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatingNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatingNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.calc; -import java.util.*; - import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; @@ -33,12 +31,4 @@ public FloatingNode(Stamp stamp) { super(stamp); } - - public FloatingNode(Stamp stamp, ValueNode... dependencies) { - super(stamp, dependencies); - } - - public FloatingNode(Stamp stamp, List dependencies) { - super(stamp, dependencies); - } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java Fri May 10 18:28:30 2013 +0200 @@ -22,10 +22,9 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; -public interface Access extends DeoptimizingNode { +public interface Access extends DeoptimizingNode, GuardedNode { ValueNode object(); @@ -33,5 +32,4 @@ void setNullCheck(boolean check); - Node asNode(); } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,10 +22,7 @@ */ package com.oracle.graal.nodes.extended; -import java.util.*; - import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; @@ -34,8 +31,9 @@ * {@linkplain #nullCheckLocation() location}. The access does not include a null check on the * object. */ -public abstract class AccessNode extends DeoptimizingFixedWithNextNode implements Access { +public abstract class AccessNode extends DeoptimizingFixedWithNextNode implements Access, GuardingNode { + @Input private GuardingNode guard; @Input private ValueNode object; @Input private ValueNode location; private boolean nullCheck; @@ -61,25 +59,18 @@ } public AccessNode(ValueNode object, ValueNode location, Stamp stamp) { + this(object, location, stamp, null); + } + + public AccessNode(ValueNode object, ValueNode location, Stamp stamp, GuardingNode guard) { super(stamp); this.object = object; this.location = location; - } - - public AccessNode(ValueNode object, ValueNode location, Stamp stamp, List dependencies) { - super(stamp, dependencies); - this.object = object; - this.location = location; - } - - public AccessNode(ValueNode object, ValueNode location, Stamp stamp, ValueNode... dependencies) { - super(stamp, dependencies); - this.object = object; - this.location = location; + this.guard = guard; } @Override - public Node asNode() { + public AccessNode asNode() { return this; } @@ -92,4 +83,15 @@ public DeoptimizationReason getDeoptimizationReason() { return DeoptimizationReason.NullCheckException; } + + @Override + public GuardingNode getGuard() { + return guard; + } + + @Override + public void setGuard(GuardingNode guard) { + updateUsages(this.guard == null ? null : this.guard.asNode(), guard == null ? null : guard.asNode()); + this.guard = guard; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatableAccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatableAccessNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatableAccessNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import java.util.*; - import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; @@ -36,12 +34,8 @@ super(object, location, stamp); } - public FloatableAccessNode(ValueNode object, ValueNode location, Stamp stamp, List dependencies) { - super(object, location, stamp, dependencies); - } - - public FloatableAccessNode(ValueNode object, ValueNode location, Stamp stamp, ValueNode... dependencies) { - super(object, location, stamp, dependencies); + public FloatableAccessNode(ValueNode object, ValueNode location, Stamp stamp, GuardingNode guard) { + super(object, location, stamp, guard); } public abstract FloatingAccessNode asFloatingNode(ValueNode lastLocationAccess); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,15 +22,11 @@ */ package com.oracle.graal.nodes.extended; -import java.util.*; - import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.type.*; -public abstract class FloatingAccessNode extends FloatingNode implements Access { +public abstract class FloatingAccessNode extends FloatingGuardedNode implements Access { @Input private ValueNode object; @Input private LocationNode location; @@ -63,20 +59,14 @@ this.location = location; } - public FloatingAccessNode(ValueNode object, LocationNode location, Stamp stamp, ValueNode... dependencies) { - super(stamp, dependencies); - this.object = object; - this.location = location; - } - - public FloatingAccessNode(ValueNode object, LocationNode location, Stamp stamp, List dependencies) { - super(stamp, dependencies); + public FloatingAccessNode(ValueNode object, LocationNode location, Stamp stamp, GuardingNode guard) { + super(stamp, guard); this.object = object; this.location = location; } @Override - public Node asNode() { + public FloatingAccessNode asNode() { return this; } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import java.util.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -38,13 +36,12 @@ @Input private Node lastLocationAccess; - public FloatingReadNode(ValueNode object, LocationNode location, Node lastLocationAccess, Stamp stamp, ValueNode... dependencies) { - super(object, location, stamp, dependencies); - this.lastLocationAccess = lastLocationAccess; + public FloatingReadNode(ValueNode object, LocationNode location, Node lastLocationAccess, Stamp stamp) { + this(object, location, lastLocationAccess, stamp, null); } - public FloatingReadNode(ValueNode object, LocationNode location, Node lastLocationAccess, Stamp stamp, List dependencies) { - super(object, location, stamp, dependencies); + public FloatingReadNode(ValueNode object, LocationNode location, Node lastLocationAccess, Stamp stamp, GuardingNode guard) { + super(object, location, stamp, guard); this.lastLocationAccess = lastLocationAccess; } @@ -65,6 +62,6 @@ @Override public Access asFixedNode() { - return graph().add(new ReadNode(object(), nullCheckLocation(), stamp(), dependencies())); + return graph().add(new ReadNode(object(), nullCheckLocation(), stamp(), getGuard())); } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GuardedNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GuardedNode.java Fri May 10 18:28:30 2013 +0200 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.extended; + +import com.oracle.graal.nodes.*; + +public interface GuardedNode { + + GuardingNode getGuard(); + + void setGuard(GuardingNode guard); + + ValueNode asNode(); +} diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GuardingNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GuardingNode.java Fri May 10 18:28:30 2013 +0200 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.extended; + +import com.oracle.graal.nodes.*; + +public interface GuardingNode { + + ValueNode asNode(); +} diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/NullCheckNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/NullCheckNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/NullCheckNode.java Fri May 10 18:28:30 2013 +0200 @@ -27,7 +27,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -public class NullCheckNode extends DeoptimizingFixedWithNextNode implements LIRLowerable { +public class NullCheckNode extends DeoptimizingFixedWithNextNode implements LIRLowerable, GuardingNode { @Input public ValueNode object; @@ -54,4 +54,9 @@ public DeoptimizationReason getDeoptimizationReason() { return DeoptimizationReason.NullCheckException; } + + @Override + public ValueNode asNode() { + return this; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Fri May 10 18:28:30 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import java.util.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -40,20 +38,20 @@ super(object, location, stamp); } - public ReadNode(ValueNode object, ValueNode location, Stamp stamp, List dependencies) { - super(object, location, stamp, dependencies); + public ReadNode(ValueNode object, ValueNode location, Stamp stamp, GuardingNode guard) { + super(object, location, stamp, guard); } private ReadNode(ValueNode object, int displacement, LocationIdentity locationIdentity, Kind kind) { super(object, ConstantLocationNode.create(locationIdentity, kind, displacement, object.graph()), StampFactory.forKind(kind)); } - private ReadNode(ValueNode object, ValueNode location, ValueNode dependency) { + private ReadNode(ValueNode object, ValueNode location, GuardingNode guard) { /* * Used by node intrinsics. Since the initial value for location is a parameter, i.e., a * LocalNode, the constructor cannot use the declared type LocationNode. */ - super(object, location, StampFactory.forNodeIntrinsic(), dependency); + super(object, location, StampFactory.forNodeIntrinsic(), guard); } @Override @@ -69,7 +67,7 @@ @Override public FloatingAccessNode asFloatingNode(ValueNode lastLocationAccess) { - return graph().unique(new FloatingReadNode(object(), location(), lastLocationAccess, stamp(), dependencies())); + return graph().unique(new FloatingReadNode(object(), location(), lastLocationAccess, stamp(), getGuard())); } public static ValueNode canonicalizeRead(ValueNode read, LocationNode location, ValueNode object, CanonicalizerTool tool) { diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Fri May 10 18:28:30 2013 +0200 @@ -37,7 +37,7 @@ } public UnsafeCastNode(ValueNode object, Stamp stamp, ValueNode anchor) { - super(object, stamp, anchor); + super(object, stamp, (FixedNode) anchor); } public UnsafeCastNode(ValueNode object, ResolvedJavaType toType, boolean exactType, boolean nonNull) { diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java Fri May 10 18:28:30 2013 +0200 @@ -34,7 +34,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, Node.IterableNodeType, Virtualizable { +public final class ValueAnchorNode extends FixedWithNextNode implements Canonicalizable, LIRLowerable, Node.IterableNodeType, Virtualizable, GuardingNode { @Input private NodeInputList anchored; @@ -111,4 +111,9 @@ } tool.delete(); } + + @Override + public ValueNode asNode() { + return this; + } } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java Fri May 10 18:28:30 2013 +0200 @@ -27,6 +27,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.cfg.*; +import com.oracle.graal.nodes.extended.*; public interface LoweringTool { @@ -34,11 +35,11 @@ Replacements getReplacements(); - ValueNode createNullCheckGuard(NodeInputList dependencies, ValueNode object); + GuardingNode createNullCheckGuard(GuardedNode guardedNode, ValueNode object); - ValueNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action); + GuardingNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action); - ValueNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, boolean negated); + GuardingNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, boolean negated); Assumptions assumptions(); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java Fri May 10 18:28:30 2013 +0200 @@ -116,16 +116,10 @@ } Collection hits = new LinkedList<>(); for (GuardNode guard : merge.guards()) { - if (guard.dependencies().size() != 1) { - continue; - } for (AbstractEndNode end : merge.forwardEnds()) { AbstractBeginNode begin = AbstractBeginNode.prevBegin(end); boolean found = false; for (GuardNode predecessorGuard : begin.guards()) { - if (predecessorGuard.dependencies().size() != 1) { - continue; - } if (guard.condition() == predecessorGuard.condition() && guard.negated() == predecessorGuard.negated()) { hits.add(guard); found = true; @@ -154,9 +148,6 @@ for (Node successor : controlSplit.successors()) { AbstractBeginNode begin = (AbstractBeginNode) successor; for (GuardNode guard : begin.guards()) { - if (guard.dependencies().size() != 1) { - continue; - } Condition condition = new Condition(guard.condition(), guard.negated()); Collection guards = conditionToGuard.get(condition); if (guards == null) { @@ -177,7 +168,7 @@ DeoptimizationAction action = DeoptimizationAction.None; Set begins = new HashSet<>(3); for (GuardNode guard : guards) { - AbstractBeginNode begin = (AbstractBeginNode) guard.dependencies().first(); + AbstractBeginNode begin = (AbstractBeginNode) guard.getGuard(); begins.add(begin); if (guard.action().ordinal() > action.ordinal()) { action = guard.action(); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Fri May 10 18:28:30 2013 +0200 @@ -165,12 +165,10 @@ FloatingAccessNode floatingNode = accessNode.asFloatingNode(lastLocationAccess); floatingNode.setNullCheck(accessNode.getNullCheck()); ValueAnchorNode anchor = null; - for (GuardNode guard : accessNode.dependencies().filter(GuardNode.class)) { - if (anchor == null) { - anchor = graph.add(new ValueAnchorNode()); - graph.addAfterFixed(accessNode, anchor); - } - anchor.addAnchoredNode(guard); + GuardingNode guard = accessNode.getGuard(); + if (guard != null) { + anchor = graph.add(new ValueAnchorNode(guard.asNode())); + graph.addAfterFixed(accessNode, anchor); } graph.replaceFixedWithFloating(accessNode, floatingNode); } diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Fri May 10 18:28:30 2013 +0200 @@ -114,8 +114,7 @@ private void processAccess(Access access) { GuardNode guard = nullGuarded.get(access.object()); if (guard != null && isImplicitNullCheck(access.nullCheckLocation())) { - NodeInputList dependencies = ((ValueNode) access).dependencies(); - dependencies.remove(guard); + access.setGuard(guard.getGuard()); Access fixedAccess = access; if (access instanceof FloatingAccessNode) { fixedAccess = ((FloatingAccessNode) access).asFixedNode(); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Fri May 10 18:28:30 2013 +0200 @@ -31,6 +31,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.cfg.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.spi.Lowerable.LoweringType; import com.oracle.graal.phases.*; @@ -45,12 +46,12 @@ final class LoweringToolImpl implements LoweringTool { private final PhaseContext context; - private final FixedNode guardAnchor; + private final GuardingNode guardAnchor; private final NodeBitMap activeGuards; private FixedWithNextNode lastFixedNode; private ControlFlowGraph cfg; - public LoweringToolImpl(PhaseContext context, FixedNode guardAnchor, NodeBitMap activeGuards, ControlFlowGraph cfg) { + public LoweringToolImpl(PhaseContext context, GuardingNode guardAnchor, NodeBitMap activeGuards, ControlFlowGraph cfg) { this.context = context; this.guardAnchor = guardAnchor; this.activeGuards = activeGuards; @@ -68,18 +69,19 @@ } @Override - public ValueNode createNullCheckGuard(NodeInputList list, ValueNode object) { + public GuardingNode createNullCheckGuard(GuardedNode guardedNode, ValueNode object) { if (object.objectStamp().nonNull()) { // Short cut creation of null check guard if the object is known to be non-null. return null; } - ValueNode guard = createGuard(object.graph().unique(new IsNullNode(object)), DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true); - list.add(guard); + GuardingNode guard = createGuard(object.graph().unique(new IsNullNode(object)), DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true); + assert guardedNode.getGuard() == null; + guardedNode.setGuard(guard); return guard; } @Override - public ValueNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action) { + public GuardingNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action) { return createGuard(condition, deoptReason, action, false); } @@ -89,7 +91,7 @@ } @Override - public ValueNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, boolean negated) { + public GuardingNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, boolean negated) { if (loweringType == LoweringType.AFTER_GUARDS) { throw new GraalInternalError("Cannot create guards in after-guard lowering"); } @@ -100,7 +102,7 @@ } } } - GuardNode newGuard = guardAnchor.graph().unique(new GuardNode(condition, guardAnchor, deoptReason, action, negated)); + GuardNode newGuard = guardAnchor.asNode().graph().unique(new GuardNode(condition, guardAnchor, deoptReason, action, negated)); if (GraalOptions.OptEliminateGuards) { activeGuards.grow(); activeGuards.mark(newGuard); @@ -179,9 +181,9 @@ processBlock(schedule.getCFG().getStartBlock(), graph.createNodeBitMap(), null); } - private void processBlock(Block block, NodeBitMap activeGuards, FixedNode parentAnchor) { + private void processBlock(Block block, NodeBitMap activeGuards, GuardingNode parentAnchor) { - FixedNode anchor = parentAnchor; + GuardingNode anchor = parentAnchor; if (anchor == null) { anchor = block.getBeginNode(); } @@ -202,13 +204,13 @@ } if (parentAnchor == null && GraalOptions.OptEliminateGuards) { - for (GuardNode guard : anchor.usages().filter(GuardNode.class)) { + for (GuardNode guard : anchor.asNode().usages().filter(GuardNode.class)) { activeGuards.clear(guard); } } } - private void process(final Block b, final NodeBitMap activeGuards, final FixedNode anchor) { + private void process(final Block b, final NodeBitMap activeGuards, final GuardingNode anchor) { final LoweringToolImpl loweringTool = new LoweringToolImpl(context, anchor, activeGuards, schedule.getCFG()); diff -r 37e996855762 -r 183d33c76419 graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Fri May 10 18:17:58 2013 +0200 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Fri May 10 18:28:30 2013 +0200 @@ -313,7 +313,7 @@ graph.addBeforeFixed(invoke.asNode(), read); // The read must not float outside its block otherwise it may float above an explicit zero // check on its base address - read.dependencies().add(AbstractBeginNode.prevBegin(invoke.asNode())); + read.setGuard(AbstractBeginNode.prevBegin(invoke.asNode())); return read; }