# HG changeset patch # User Doug Simon # Date 1336728399 -7200 # Node ID 3035b6b881d90fd60064c0ac35eea8a5320e4c89 # Parent 6ed04fb6affd63155a980bfb204c1d04940cac79 removed stateAfter field from FixedWithNextNode - now only StateSplit implementations have this field diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InsertStateAfterPlaceholderPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InsertStateAfterPlaceholderPhase.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InsertStateAfterPlaceholderPhase.java Fri May 11 11:26:39 2012 +0200 @@ -29,7 +29,7 @@ public class InsertStateAfterPlaceholderPhase extends Phase { - private static class PlaceholderNode extends FixedWithNextNode implements StateSplit, Node.IterableNodeType, LIRLowerable { + private static class PlaceholderNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType, LIRLowerable { public PlaceholderNode() { super(StampFactory.illegal()); } diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri May 11 11:26:39 2012 +0200 @@ -1263,7 +1263,7 @@ FixedNode target = createTarget(probability, block, stateAfter); BeginNode begin = BeginNode.begin(target); - assert !(target instanceof DeoptimizeNode && begin instanceof StateSplit) : + assert !(target instanceof DeoptimizeNode && begin.stateAfter() != null) : "We are not allowed to set the stateAfter of the begin node, because we have to deoptimize to a bci _before_ the actual if, so that the interpreter can update the profiling information."; return begin; } @@ -1469,9 +1469,13 @@ frameState.clearNonLiveLocals(currentBlock.localsLiveOut); } if (lastInstr instanceof StateSplit) { - StateSplit stateSplit = (StateSplit) lastInstr; - if (stateSplit.stateAfter() == null) { - stateSplit.setStateAfter(frameState.create(bci)); + if (lastInstr.getClass() == BeginNode.class) { + // BeginNodes do not need a frame state + } else { + StateSplit stateSplit = (StateSplit) lastInstr; + if (stateSplit.stateAfter() == null) { + stateSplit.setStateAfter(frameState.create(bci)); + } } } if (bci < endBCI) { diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java Fri May 11 11:26:39 2012 +0200 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012, 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.type.*; + +/** + * Provides an implementation of {@link StateSplit}. + */ +public abstract class AbstractStateSplit extends FixedWithNextNode implements StateSplit { + + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } + + public AbstractStateSplit(Stamp stamp) { + super(stamp); + } +} diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java Fri May 11 11:26:39 2012 +0200 @@ -31,7 +31,23 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -public class BeginNode extends FixedWithNextNode implements LIRLowerable, Simplifiable, Node.IterableNodeType { +public class BeginNode extends FixedWithNextNode implements StateSplit, LIRLowerable, Simplifiable, Node.IterableNodeType { + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return false; + } + public BeginNode() { super(StampFactory.illegal()); } diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java Fri May 11 11:26:39 2012 +0200 @@ -24,6 +24,8 @@ /** * Base class for {@link BeginNode}s that are associated with a frame state. + * TODO (dnsimon) this not needed until {@link BeginNode} no longer implements {@link StateSplit} + * which is not possible until loop peeling works without requiring begin nodes to have frames states */ public abstract class BeginStateSplitNode extends BeginNode implements StateSplit { diff -r 6ed04fb6affd -r 3035b6b881d9 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 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedWithNextNode.java Fri May 11 11:26:39 2012 +0200 @@ -22,43 +22,13 @@ */ package com.oracle.graal.nodes; -import java.util.*; - import com.oracle.graal.nodes.type.*; /** * Base class of all nodes that are fixed within the control flow graph and have an immediate successor. - * This class also provides an implementation of {@link StateSplit} without being a {@link StateSplit} itself. */ public abstract class FixedWithNextNode extends FixedNode { - @Input(notDataflow = true) private FrameState stateAfter; - - public FrameState stateAfter() { - return stateAfter; - } - - public void setStateAfter(FrameState x) { - assert x == null || x.isAlive() : "frame state must be in a graph"; - assert this instanceof StateSplit : getClass() + " does not implement " + StateSplit.class; - updateUsages(stateAfter, x); - stateAfter = x; - } - - // Subclasses that implement StateSplit but do not represent side-effecting instructions must override this. - public boolean hasSideEffect() { - return true; - } - - @Override - public Map getDebugProperties() { - Map debugProperties = super.getDebugProperties(); - if (stateAfter() != null) { - debugProperties.put("stateAfter", stateAfter().toString(Verbosity.Debugger)); - } - return debugProperties; - } - public FixedNode next() { assert scheduledNext() == null || scheduledNext() instanceof FixedNode : "next() cannot be used while the graph is scheduled"; return (FixedNode) scheduledNext(); diff -r 6ed04fb6affd -r 3035b6b881d9 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 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Fri May 11 11:26:39 2012 +0200 @@ -34,7 +34,7 @@ /** * The {@code InvokeNode} represents all kinds of method calls. */ -public final class InvokeNode extends FixedWithNextNode implements StateSplit, Node.IterableNodeType, Invoke, LIRLowerable, MemoryCheckpoint { +public final class InvokeNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType, Invoke, LIRLowerable, MemoryCheckpoint { @Input private final MethodCallTargetNode callTarget; private final int bci; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java Fri May 11 11:26:39 2012 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.nodes; +import java.util.*; + import com.oracle.graal.graph.*; public class ScheduledNode extends Node { @@ -36,4 +38,17 @@ updatePredecessors(scheduledNext, x); scheduledNext = x; } + + @Override + public Map getDebugProperties() { + Map debugProperties = super.getDebugProperties(); + if (this instanceof StateSplit) { + StateSplit stateSplit = (StateSplit) this; + if (stateSplit.stateAfter() != null) { + debugProperties.put("stateAfter", stateSplit.stateAfter().toString(Verbosity.Debugger)); + } + } + return debugProperties; + } + } diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractCallNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractCallNode.java Fri May 11 11:26:39 2012 +0200 @@ -26,7 +26,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; -public abstract class AbstractCallNode extends FixedWithNextNode implements StateSplit, MemoryCheckpoint { +public abstract class AbstractCallNode extends AbstractStateSplit implements StateSplit, MemoryCheckpoint { @Input protected final NodeInputList arguments; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BoxNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BoxNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BoxNode.java Fri May 11 11:26:39 2012 +0200 @@ -22,16 +22,16 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.max.cri.ci.*; -import com.oracle.max.cri.ri.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; -import com.oracle.graal.nodes.java.MethodCallTargetNode.*; +import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; import com.oracle.graal.nodes.type.*; +import com.oracle.max.cri.ci.*; +import com.oracle.max.cri.ri.*; -public final class BoxNode extends FixedWithNextNode implements StateSplit, Node.IterableNodeType { +public final class BoxNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType { @Input private ValueNode source; private int bci; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Fri May 11 11:26:39 2012 +0200 @@ -30,7 +30,7 @@ /** * Creates a memory barrier. */ -public class MembarNode extends FixedWithNextNode implements StateSplit, LIRLowerable, MemoryCheckpoint { +public class MembarNode extends AbstractStateSplit implements StateSplit, LIRLowerable, MemoryCheckpoint { private final int barriers; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Fri May 11 11:26:39 2012 +0200 @@ -26,14 +26,29 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; import com.oracle.max.cri.ci.*; -import com.oracle.graal.nodes.type.*; import com.oracle.max.cri.ri.*; public class SafeWriteNode extends SafeAccessNode implements StateSplit, Lowerable{ @Input private ValueNode value; + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } public SafeWriteNode(ValueNode object, ValueNode value, LocationNode location, long leafGraphId) { super(object, location, StampFactory.forKind(CiKind.Void), leafGraphId); diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Fri May 11 11:26:39 2012 +0200 @@ -38,6 +38,21 @@ @Input private ValueNode value; private final int displacement; private final CiKind storeKind; + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } public UnsafeStoreNode(ValueNode object, int displacement, ValueNode offset, ValueNode value, CiKind kind) { super(StampFactory.illegal()); diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java Fri May 11 11:26:39 2012 +0200 @@ -27,7 +27,7 @@ import com.oracle.graal.nodes.type.*; -public final class WriteMemoryCheckpointNode extends FixedWithNextNode implements StateSplit, LIRLowerable, MemoryCheckpoint { +public final class WriteMemoryCheckpointNode extends AbstractStateSplit implements StateSplit, LIRLowerable, MemoryCheckpoint { public WriteMemoryCheckpointNode() { this(StampFactory.illegal()); diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Fri May 11 11:26:39 2012 +0200 @@ -22,14 +22,29 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.max.cri.ci.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.max.cri.ci.*; public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable { @Input private ValueNode value; + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } public ValueNode value() { return value; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java Fri May 11 11:26:39 2012 +0200 @@ -43,7 +43,7 @@ * {@link MonitorEnterNode}. Optimization phases are free to throw {@link CiBailout} if they detect such cases. * Otherwise, they are detected during LIR construction. */ -public abstract class AccessMonitorNode extends FixedWithNextNode implements StateSplit, MemoryCheckpoint { +public abstract class AccessMonitorNode extends AbstractStateSplit implements StateSplit, MemoryCheckpoint { @Input private ValueNode object; private boolean eliminated; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Fri May 11 11:26:39 2012 +0200 @@ -33,7 +33,7 @@ * Represents an atomic compare-and-swap operation * The result is a boolean that contains whether the value matched the expected value. */ -public class CompareAndSwapNode extends FixedWithNextNode implements StateSplit, LIRLowerable, Lowerable, MemoryCheckpoint { +public class CompareAndSwapNode extends AbstractStateSplit implements StateSplit, LIRLowerable, Lowerable, MemoryCheckpoint { @Input private ValueNode object; @Input private ValueNode offset; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Fri May 11 11:26:39 2012 +0200 @@ -31,7 +31,7 @@ /** * The {@code ExceptionObject} instruction represents the incoming exception object to an exception handler. */ -public class ExceptionObjectNode extends FixedWithNextNode implements StateSplit, LIRLowerable, MemoryCheckpoint { +public class ExceptionObjectNode extends AbstractStateSplit implements StateSplit, LIRLowerable, MemoryCheckpoint { /** * Constructs a new ExceptionObject instruction. diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Fri May 11 11:26:39 2012 +0200 @@ -31,7 +31,7 @@ /** * This node is used to perform the finalizer registration at the end of the java.lang.Object constructor. */ -public final class RegisterFinalizerNode extends FixedWithNextNode implements StateSplit, Canonicalizable, LIRLowerable { +public final class RegisterFinalizerNode extends AbstractStateSplit implements StateSplit, Canonicalizable, LIRLowerable { @Input private ValueNode object; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java Fri May 11 11:26:39 2012 +0200 @@ -32,6 +32,21 @@ public final class StoreFieldNode extends AccessFieldNode implements StateSplit { @Input private ValueNode value; + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } public ValueNode value() { return value; diff -r 6ed04fb6affd -r 3035b6b881d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java Fri May 11 10:57:50 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java Fri May 11 11:26:39 2012 +0200 @@ -22,11 +22,11 @@ */ package com.oracle.graal.nodes.java; -import com.oracle.max.cri.ci.*; import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.max.cri.ci.*; /** * The {@code StoreIndexedNode} represents a write to an array element. @@ -34,6 +34,21 @@ public final class StoreIndexedNode extends AccessIndexedNode implements StateSplit, Lowerable { @Input private ValueNode value; + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } public ValueNode value() { return value;