# HG changeset patch # User Lukas Stadler # Date 1371652976 -7200 # Node ID ae6f0c381087a38b930414154d3cc5c7a76d401d # Parent 97e8cabe9064de191fe9a1a29fa7fdd4b22face3 split MemoryCheckpoint interface into Single and Multi diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/WriteBarrierVerificationTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/WriteBarrierVerificationTest.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/WriteBarrierVerificationTest.java Wed Jun 19 16:42:56 2013 +0200 @@ -640,7 +640,7 @@ protected Boolean processNode(FixedNode node, Boolean currentState) { if (node instanceof WriteNode) { WriteNode write = (WriteNode) node; - LocationIdentity obj = write.getLocationIdentities()[0]; + LocationIdentity obj = write.getLocationIdentity(); if (obj instanceof ResolvedJavaField) { if (((ResolvedJavaField) obj).getName().equals("barrierIndex")) { /* diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.hotspot.nodes; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.gen.*; @@ -40,7 +38,7 @@ * is locked (ensuring the GC sees and updates the object) so it must come after any null pointer * check on the object. */ -public final class BeginLockScopeNode extends AbstractStateSplit implements LIRGenLowerable, MonitorEnter { +public final class BeginLockScopeNode extends AbstractStateSplit implements LIRGenLowerable, MonitorEnter, MemoryCheckpoint.Single { private int lockDepth; @@ -55,8 +53,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -37,7 +37,7 @@ * {@linkplain #compareAndSwap(Object, long, Word, Word, LocationIdentity)} returns either the * expected value or the compared against value instead of a boolean. */ -public class DirectCompareAndSwapNode extends FixedWithNextNode implements LIRGenLowerable, MemoryCheckpoint { +public class DirectCompareAndSwapNode extends FixedWithNextNode implements LIRGenLowerable, MemoryCheckpoint.Single { @Input private ValueNode object; @Input private ValueNode offset; @@ -72,8 +72,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{locationIdentity}; + public LocationIdentity getLocationIdentity() { + return locationIdentity; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.hotspot.nodes; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.target.*; @@ -35,7 +33,7 @@ * Intrinsic for closing a {@linkplain BeginLockScopeNode scope} binding a stack-based lock with an * object. */ -public final class EndLockScopeNode extends AbstractStateSplit implements LIRGenLowerable, MonitorExit { +public final class EndLockScopeNode extends AbstractStateSplit implements LIRGenLowerable, MonitorExit, MemoryCheckpoint.Single { public EndLockScopeNode() { super(StampFactory.forVoid()); @@ -47,8 +45,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotNmethodExecuteNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotNmethodExecuteNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotNmethodExecuteNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -35,7 +35,7 @@ import com.oracle.graal.nodes.type.*; import com.oracle.graal.phases.common.*; -public class HotSpotNmethodExecuteNode extends AbstractCallNode implements Lowerable { +public class HotSpotNmethodExecuteNode extends AbstractCallNode implements Lowerable, MemoryCheckpoint.Single { @Input private ValueNode code; private final Class[] signature; @@ -47,8 +47,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{LocationIdentity.ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -35,7 +35,7 @@ * Node for a {@linkplain ForeignCallDescriptor foreign} call from within a stub. */ @NodeInfo(nameTemplate = "StubForeignCall#{p#descriptor/s}") -public class StubForeignCallNode extends FixedWithNextNode implements DeoptimizingNode, LIRLowerable, MemoryCheckpoint { +public class StubForeignCallNode extends FixedWithNextNode implements DeoptimizingNode, LIRLowerable, MemoryCheckpoint.Multi { @Input private final NodeInputList arguments; private final MetaAccessProvider runtime; diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,22 +22,20 @@ */ package com.oracle.graal.nodes; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import java.util.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.Stamp; +import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.util.*; /** * The {@code InvokeNode} represents all kinds of method calls. */ @NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}") -public final class InvokeNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType, Invoke, LIRLowerable, MemoryCheckpoint { +public final class InvokeNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType, Invoke, LIRLowerable, MemoryCheckpoint.Single { @Input private CallTargetNode callTarget; @Input private FrameState deoptState; @@ -105,8 +103,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import java.util.*; import com.oracle.graal.api.meta.*; @@ -34,7 +32,7 @@ import com.oracle.graal.nodes.util.*; @NodeInfo(nameTemplate = "Invoke!#{p#targetMethod/s}") -public class InvokeWithExceptionNode extends ControlSplitNode implements Node.IterableNodeType, Invoke, MemoryCheckpoint, LIRLowerable { +public class InvokeWithExceptionNode extends ControlSplitNode implements Node.IterableNodeType, Invoke, MemoryCheckpoint.Single, LIRLowerable { private static final double EXCEPTION_PROBA = 1e-5; @@ -158,8 +156,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } public FrameState stateDuring() { diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,18 +22,16 @@ */ package com.oracle.graal.nodes; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.extended.*; /** * The start node of a graph. */ -public class StartNode extends BeginStateSplitNode implements MemoryCheckpoint { +public class StartNode extends BeginStateSplitNode implements MemoryCheckpoint.Single { @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } } diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractCallNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -26,7 +26,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; -public abstract class AbstractCallNode extends AbstractStateSplit implements StateSplit, MemoryCheckpoint { +public abstract class AbstractCallNode extends AbstractStateSplit implements StateSplit { @Input private final NodeInputList arguments; diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -33,7 +33,7 @@ * Node for a {@linkplain ForeignCallDescriptor foreign} call. */ @NodeInfo(nameTemplate = "ForeignCall#{p#descriptor/s}") -public class ForeignCallNode extends AbstractStateSplit implements LIRLowerable, DeoptimizingNode, MemoryCheckpoint { +public class ForeignCallNode extends AbstractStateSplit implements LIRLowerable, DeoptimizingNode, MemoryCheckpoint.Multi { @Input private final NodeInputList arguments; private final MetaAccessProvider runtime; diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import static com.oracle.graal.api.meta.LocationIdentity.*; import static com.oracle.graal.graph.UnsafeAccess.*; import java.lang.reflect.*; @@ -39,7 +38,7 @@ /** * Creates a memory barrier. */ -public class MembarNode extends FixedWithNextNode implements LIRLowerable, MemoryCheckpoint { +public class MembarNode extends FixedWithNextNode implements LIRLowerable, MemoryCheckpoint.Single { private final int barriers; @@ -52,8 +51,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java Wed Jun 19 16:42:56 2013 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; /** @@ -32,12 +33,35 @@ */ public interface MemoryCheckpoint { - /** - * This method is used to determine which set of memory locations is killed by this node. - * Returning the special value {@link LocationIdentity#ANY_LOCATION} will kill all memory locations. - * - * @return the identities of all locations killed by this node. - */ - LocationIdentity[] getLocationIdentities(); + interface Single extends MemoryCheckpoint { + + /** + * This method is used to determine which memory location is killed by this node. Returning + * the special value {@link LocationIdentity#ANY_LOCATION} will kill all memory locations. + * + * @return the identity of the location killed by this node. + */ + LocationIdentity getLocationIdentity(); + + } + + interface Multi extends MemoryCheckpoint { + /** + * This method is used to determine which set of memory locations is killed by this node. + * Returning the special value {@link LocationIdentity#ANY_LOCATION} will kill all memory + * locations. + * + * @return the identities of all locations killed by this node. + */ + LocationIdentity[] getLocationIdentities(); + + } + + public class TypeAssertion { + + public static boolean correctType(Node node) { + return !(node instanceof MemoryCheckpoint) || (node instanceof MemoryCheckpoint.Single ^ node instanceof MemoryCheckpoint.Multi); + } + } } diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MonitorEnter.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MonitorEnter.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MonitorEnter.java Wed Jun 19 16:42:56 2013 +0200 @@ -25,6 +25,6 @@ /** * Denotes monitor locking transition. */ -public interface MonitorEnter extends MemoryCheckpoint { +public interface MonitorEnter { } diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import static com.oracle.graal.api.meta.LocationIdentity.*; import static com.oracle.graal.graph.UnsafeAccess.*; import com.oracle.graal.api.meta.*; @@ -35,7 +34,7 @@ * Store of a value at a location specified as an offset relative to an object. No null check is * performed before the store. */ -public class UnsafeStoreNode extends UnsafeAccessNode implements StateSplit, Lowerable, Virtualizable, Canonicalizable, MemoryCheckpoint { +public class UnsafeStoreNode extends UnsafeAccessNode implements StateSplit, Lowerable, Virtualizable, Canonicalizable, MemoryCheckpoint.Single { @Input private ValueNode value; @Input(notDataflow = true) private FrameState stateAfter; @@ -74,8 +73,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,14 +22,12 @@ */ package com.oracle.graal.nodes.extended; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -public final class WriteMemoryCheckpointNode extends AbstractStateSplit implements StateSplit, LIRLowerable, MemoryCheckpoint { +public final class WriteMemoryCheckpointNode extends AbstractStateSplit implements StateSplit, LIRLowerable, MemoryCheckpoint.Single { public WriteMemoryCheckpointNode() { this(StampFactory.forVoid()); @@ -40,8 +38,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -33,7 +33,7 @@ /** * Writes a given {@linkplain #value() value} a {@linkplain AccessNode memory location}. */ -public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint, Node.IterableNodeType, Virtualizable { +public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint.Single, Node.IterableNodeType, Virtualizable { @Input private ValueNode value; @Input(notDataflow = true) private FrameState stateAfter; @@ -71,8 +71,8 @@ public static native void writeMemory(Object object, Object value, Location location, @ConstantNodeParameter WriteBarrierType barrierType, @ConstantNodeParameter boolean compress); @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{location().getLocationIdentity()}; + public LocationIdentity getLocationIdentity() { + return location().getLocationIdentity(); } @Override diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.java; -import static com.oracle.graal.api.meta.LocationIdentity.*; import static com.oracle.graal.graph.UnsafeAccess.*; import com.oracle.graal.api.meta.*; @@ -36,7 +35,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 AbstractStateSplit implements StateSplit, LIRLowerable, Lowerable, MemoryCheckpoint, Node.IterableNodeType, HeapAccess { +public class CompareAndSwapNode extends AbstractStateSplit implements StateSplit, LIRLowerable, Lowerable, MemoryCheckpoint.Single, Node.IterableNodeType, HeapAccess { @Input private ValueNode object; @Input private ValueNode offset; @@ -107,8 +106,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.java; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; @@ -35,15 +33,15 @@ * The entry to an exception handler with the exception coming from a call (as opposed to a local * throw instruction or implicit exception). */ -public class ExceptionObjectNode extends DispatchBeginNode implements Lowerable, MemoryCheckpoint { +public class ExceptionObjectNode extends DispatchBeginNode implements Lowerable, MemoryCheckpoint.Single { public ExceptionObjectNode(MetaAccessProvider runtime) { super(StampFactory.declaredNonNull(runtime.lookupJavaType(Throwable.class))); } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.java; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; @@ -32,7 +30,7 @@ /** * The {@code MonitorEnterNode} represents the acquisition of a monitor. */ -public final class MonitorEnterNode extends AccessMonitorNode implements Virtualizable, Lowerable, MonitorEnter, MonitorReference { +public final class MonitorEnterNode extends AccessMonitorNode implements Virtualizable, Lowerable, MonitorEnter, MemoryCheckpoint.Single, MonitorReference { private int lockDepth; @@ -47,8 +45,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.java; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -33,7 +31,7 @@ /** * The {@code MonitorEnterNode} represents a monitor release. */ -public final class MonitorExitNode extends AccessMonitorNode implements Virtualizable, Lowerable, Node.IterableNodeType, MonitorExit, MonitorReference { +public final class MonitorExitNode extends AccessMonitorNode implements Virtualizable, Lowerable, Node.IterableNodeType, MonitorExit, MemoryCheckpoint.Single, MonitorReference { private int lockDepth; @@ -48,8 +46,8 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } @Override diff -r 97e8cabe9064 -r ae6f0c381087 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 Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Wed Jun 19 16:42:56 2013 +0200 @@ -91,8 +91,10 @@ @Override protected Set processNode(FixedNode node, Set currentState) { - if (node instanceof MemoryCheckpoint) { - for (LocationIdentity identity : ((MemoryCheckpoint) node).getLocationIdentities()) { + if (node instanceof MemoryCheckpoint.Single) { + currentState.add(((MemoryCheckpoint.Single) node).getLocationIdentity()); + } else if (node instanceof MemoryCheckpoint.Multi) { + for (LocationIdentity identity : ((MemoryCheckpoint.Multi) node).getLocationIdentities()) { currentState.add(identity); } } @@ -143,13 +145,24 @@ protected MemoryMap processNode(FixedNode node, MemoryMap state) { if (node instanceof FloatableAccessNode) { processFloatable((FloatableAccessNode) node, state); - } else if (node instanceof MemoryCheckpoint) { - processCheckpoint((MemoryCheckpoint) node, state); + } else if (node instanceof MemoryCheckpoint.Single) { + processCheckpoint((MemoryCheckpoint.Single) node, state); + } else if (node instanceof MemoryCheckpoint.Multi) { + processCheckpoint((MemoryCheckpoint.Multi) node, state); } + assert MemoryCheckpoint.TypeAssertion.correctType(node) : node; return state; } - private static void processCheckpoint(MemoryCheckpoint checkpoint, MemoryMap state) { + private static void processCheckpoint(MemoryCheckpoint.Single checkpoint, MemoryMap state) { + LocationIdentity identity = checkpoint.getLocationIdentity(); + if (identity == ANY_LOCATION) { + state.lastMemorySnapshot.clear(); + } + state.lastMemorySnapshot.put(identity, (ValueNode) checkpoint); + } + + private static void processCheckpoint(MemoryCheckpoint.Multi checkpoint, MemoryMap state) { for (LocationIdentity identity : checkpoint.getLocationIdentities()) { if (identity == ANY_LOCATION) { state.lastMemorySnapshot.clear(); @@ -223,14 +236,12 @@ /* * InvokeWithException cannot be the lastLocationAccess for a FloatingReadNode. * Since it is both the invoke and a control flow split, the scheduler cannot - * schedule anything immediately the invoke. It can only schedule in the normal or - * exceptional successor - and we have to tell the scheduler here which side it - * needs to choose by putting in the location identity on both successors. + * schedule anything immediately after the invoke. It can only schedule in the + * normal or exceptional successor - and we have to tell the scheduler here which + * side it needs to choose by putting in the location identity on both successors. */ - InvokeWithExceptionNode checkpoint = (InvokeWithExceptionNode) node.predecessor(); - for (LocationIdentity identity : checkpoint.getLocationIdentities()) { - result.lastMemorySnapshot.put(identity, node); - } + InvokeWithExceptionNode invoke = (InvokeWithExceptionNode) node.predecessor(); + result.lastMemorySnapshot.put(invoke.getLocationIdentity(), node); } return result; } diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Jun 19 16:42:56 2013 +0200 @@ -96,22 +96,29 @@ for (Node node : getBlockToNodesMap().get(block)) { if (node instanceof FloatingReadNode) { currentState.add((FloatingReadNode) node); - } else if (node instanceof MemoryCheckpoint) { - for (LocationIdentity identity : ((MemoryCheckpoint) node).getLocationIdentities()) { - for (Iterator iter = currentState.iterator(); iter.hasNext();) { - FloatingReadNode read = iter.next(); - FixedNode fixed = (FixedNode) node; - if (identity == ANY_LOCATION || read.location().getLocationIdentity() == identity) { - addPhantomReference(read, fixed); - iter.remove(); - } - } + } else if (node instanceof MemoryCheckpoint.Single) { + LocationIdentity identity = ((MemoryCheckpoint.Single) node).getLocationIdentity(); + processIdentity(currentState, (FixedNode) node, identity); + } else if (node instanceof MemoryCheckpoint.Multi) { + for (LocationIdentity identity : ((MemoryCheckpoint.Multi) node).getLocationIdentities()) { + processIdentity(currentState, (FixedNode) node, identity); } } + assert MemoryCheckpoint.TypeAssertion.correctType(node); } return currentState; } + private void processIdentity(HashSet currentState, FixedNode fixed, LocationIdentity identity) { + for (Iterator iter = currentState.iterator(); iter.hasNext();) { + FloatingReadNode read = iter.next(); + if (identity == ANY_LOCATION || read.location().getLocationIdentity() == identity) { + addPhantomReference(read, fixed); + iter.remove(); + } + } + } + public void addPhantomReference(FloatingReadNode read, FixedNode fixed) { List usageList = phantomUsages.get(read); if (usageList == null) { diff -r 97e8cabe9064 -r ae6f0c381087 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Wed Jun 19 15:29:37 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Wed Jun 19 16:42:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.replacements.nodes; -import static com.oracle.graal.api.meta.LocationIdentity.*; - import java.lang.reflect.*; import com.oracle.graal.api.meta.*; @@ -35,7 +33,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.phases.common.*; -public class MacroNode extends AbstractStateSplit implements Lowerable, MemoryCheckpoint { +public class MacroNode extends AbstractStateSplit implements Lowerable, MemoryCheckpoint.Single { @Input protected final NodeInputList arguments; @@ -111,7 +109,7 @@ } @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{ANY_LOCATION}; + public LocationIdentity getLocationIdentity() { + return LocationIdentity.ANY_LOCATION; } }