# HG changeset patch # User Christian Wimmer # Date 1367521971 25200 # Node ID ae5cd887e67c83572ebe6484d3b690682223d495 # Parent 038fa65cbd8d4f4a373e9c773d531481ad49420d Use a LocationIdentity interface instead of just Object for the location identity of a LocationNode diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java Thu May 02 12:12:51 2013 -0700 @@ -31,8 +31,9 @@ import com.oracle.graal.debug.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.spi.Lowerable.*; +import com.oracle.graal.nodes.spi.Lowerable.LoweringType; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.tiers.*; @@ -66,7 +67,7 @@ StructuredGraph graph = compileTestSnippet(snippet); for (ReadNode rn : graph.getNodes().filter(ReadNode.class)) { - Object locId = rn.location().getLocationIdentity(); + LocationIdentity locId = rn.location().getLocationIdentity(); if (locId instanceof ResolvedJavaField) { ResolvedJavaField field = (ResolvedJavaField) locId; if (field.getName().equals("x")) { diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/WriteBarrierVerificationTest.java Thu May 02 12:12:51 2013 -0700 @@ -31,12 +31,13 @@ import com.oracle.graal.debug.*; import com.oracle.graal.hotspot.phases.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.spi.Lowerable.*; +import com.oracle.graal.nodes.spi.Lowerable.LoweringType; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.graph.*; -import com.oracle.graal.phases.graph.ReentrantNodeIterator.*; +import com.oracle.graal.phases.graph.ReentrantNodeIterator.NodeIteratorClosure; import com.oracle.graal.phases.tiers.*; /** @@ -643,7 +644,7 @@ protected void processNode(FixedNode node, State currentState) { if (node instanceof WriteNode) { WriteNode write = (WriteNode) node; - Object obj = write.getLocationIdentities()[0]; + LocationIdentity obj = write.getLocationIdentities()[0]; if (obj instanceof ResolvedJavaField) { if (((ResolvedJavaField) obj).getName().equals("barrierIndex")) { /* diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Thu May 02 12:12:51 2013 -0700 @@ -31,13 +31,14 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.hotspot.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.phases.*; import com.oracle.graal.replacements.*; /** * Represents a field in a HotSpot type. */ -public class HotSpotResolvedJavaField extends CompilerObject implements ResolvedJavaField { +public class HotSpotResolvedJavaField extends CompilerObject implements ResolvedJavaField, LocationIdentity { // Must not conflict with any fields flags used by the VM - the assertion in the constructor // checks this assumption diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Thu May 02 12:12:51 2013 -0700 @@ -29,6 +29,7 @@ import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.type.*; import com.oracle.graal.word.*; @@ -53,8 +54,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Thu May 02 12:12:51 2013 -0700 @@ -26,14 +26,16 @@ import com.oracle.graal.compiler.target.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.word.*; /** * A special purpose store node that differs from {@link CompareAndSwapNode} in that it is not a - * {@link StateSplit} and it {@linkplain #compareAndSwap(Object, long, Word, Word, Object)} returns - * either the expected value or the compared against value instead of a boolean. + * {@link StateSplit} and it + * {@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 { @@ -42,9 +44,9 @@ @Input private ValueNode expectedValue; @Input private ValueNode newValue; - private final Object locationIdentity; + private final LocationIdentity locationIdentity; - public DirectCompareAndSwapNode(ValueNode object, ValueNode offset, ValueNode expected, ValueNode newValue, Object locationIdentity) { + public DirectCompareAndSwapNode(ValueNode object, ValueNode offset, ValueNode expected, ValueNode newValue, LocationIdentity locationIdentity) { super(expected.stamp()); this.object = object; this.offset = offset; @@ -70,8 +72,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{locationIdentity}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{locationIdentity}; } @Override @@ -92,5 +94,5 @@ * @return either {@code expectedValue} or the actual value */ @NodeIntrinsic - public static native Word compareAndSwap(Object object, long offset, Word expectedValue, Word newValue, @ConstantNodeParameter Object locationIdentity); + public static native Word compareAndSwap(Object object, long offset, Word expectedValue, Word newValue, @ConstantNodeParameter LocationIdentity locationIdentity); } diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Thu May 02 12:12:51 2013 -0700 @@ -26,6 +26,7 @@ import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.type.*; /** @@ -44,8 +45,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotInstalledCodeExecuteNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotInstalledCodeExecuteNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotInstalledCodeExecuteNode.java Thu May 02 12:12:51 2013 -0700 @@ -30,6 +30,7 @@ import com.oracle.graal.hotspot.replacements.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -47,8 +48,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Thu May 02 12:12:51 2013 -0700 @@ -34,6 +34,7 @@ import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.replacements.Snippet.Fold; import com.oracle.graal.replacements.nodes.*; import com.oracle.graal.word.*; @@ -45,8 +46,8 @@ */ public class HotSpotReplacementsUtil { - public static final Object ANY_LOCATION = LocationNode.ANY_LOCATION; - public static final Object FINAL_LOCATION = LocationNode.FINAL_LOCATION; + public static final LocationIdentity ANY_LOCATION = LocationNode.ANY_LOCATION; + public static final LocationIdentity FINAL_LOCATION = LocationNode.FINAL_LOCATION; public static HotSpotVMConfig config() { return graalRuntime().getConfig(); @@ -62,7 +63,7 @@ return config().verifyOops; } - public static final Object EXCEPTION_OOP_LOCATION = LocationNode.createLocation("ExceptionOop"); + public static final LocationIdentity EXCEPTION_OOP_LOCATION = LocationNode.createLocation("ExceptionOop"); /** * @see HotSpotVMConfig#threadExceptionOopOffset @@ -72,35 +73,35 @@ return config().threadExceptionOopOffset; } - public static final Object EXCEPTION_PC_LOCATION = LocationNode.createLocation("ExceptionPc"); + public static final LocationIdentity EXCEPTION_PC_LOCATION = LocationNode.createLocation("ExceptionPc"); @Fold public static int threadExceptionPcOffset() { return config().threadExceptionPcOffset; } - public static final Object TLAB_TOP_LOCATION = LocationNode.createLocation("TlabTop"); + public static final LocationIdentity TLAB_TOP_LOCATION = LocationNode.createLocation("TlabTop"); @Fold public static int threadTlabTopOffset() { return config().threadTlabTopOffset; } - public static final Object TLAB_END_LOCATION = LocationNode.createLocation("TlabEnd"); + public static final LocationIdentity TLAB_END_LOCATION = LocationNode.createLocation("TlabEnd"); @Fold private static int threadTlabEndOffset() { return config().threadTlabEndOffset; } - public static final Object TLAB_START_LOCATION = LocationNode.createLocation("TlabStart"); + public static final LocationIdentity TLAB_START_LOCATION = LocationNode.createLocation("TlabStart"); @Fold private static int threadTlabStartOffset() { return config().threadTlabStartOffset; } - public static final Object PENDING_EXCEPTION_LOCATION = LocationNode.createLocation("PendingException"); + public static final LocationIdentity PENDING_EXCEPTION_LOCATION = LocationNode.createLocation("PendingException"); /** * @see HotSpotVMConfig#pendingExceptionOffset @@ -110,7 +111,7 @@ return config().pendingExceptionOffset; } - public static final Object OBJECT_RESULT_LOCATION = LocationNode.createLocation("ObjectResult"); + public static final LocationIdentity OBJECT_RESULT_LOCATION = LocationNode.createLocation("ObjectResult"); @Fold private static int objectResultOffset() { @@ -223,7 +224,7 @@ return Unsafe.getUnsafe().pageSize(); } - public static final Object PROTOTYPE_MARK_WORD_LOCATION = LocationNode.createLocation("PrototypeMarkWord"); + public static final LocationIdentity PROTOTYPE_MARK_WORD_LOCATION = LocationNode.createLocation("PrototypeMarkWord"); @Fold public static int prototypeMarkWordOffset() { @@ -264,14 +265,14 @@ return config().klassSuperKlassOffset; } - public static final Object MARK_WORD_LOCATION = LocationNode.createLocation("MarkWord"); + public static final LocationIdentity MARK_WORD_LOCATION = LocationNode.createLocation("MarkWord"); @Fold public static int markOffset() { return config().markOffset; } - public static final Object HUB_LOCATION = LocationNode.createLocation("Hub"); + public static final LocationIdentity HUB_LOCATION = LocationNode.createLocation("Hub"); @Fold private static int hubOffset() { @@ -398,21 +399,21 @@ return config().superCheckOffsetOffset; } - public static final Object SECONDARY_SUPER_CACHE_LOCATION = LocationNode.createLocation("SecondarySuperCache"); + public static final LocationIdentity SECONDARY_SUPER_CACHE_LOCATION = LocationNode.createLocation("SecondarySuperCache"); @Fold public static int secondarySuperCacheOffset() { return config().secondarySuperCacheOffset; } - public static final Object SECONDARY_SUPERS_LOCATION = LocationNode.createLocation("SecondarySupers"); + public static final LocationIdentity SECONDARY_SUPERS_LOCATION = LocationNode.createLocation("SecondarySupers"); @Fold public static int secondarySupersOffset() { return config().secondarySupersOffset; } - public static final Object DISPLACED_MARK_WORD_LOCATION = LocationNode.createLocation("DisplacedMarkWord"); + public static final LocationIdentity DISPLACED_MARK_WORD_LOCATION = LocationNode.createLocation("DisplacedMarkWord"); @Fold public static int lockDisplacedMarkOffset() { @@ -491,7 +492,7 @@ return CodeUtil.log2(wordSize()); } - public static final Object CLASS_STATE_LOCATION = LocationNode.createLocation("ClassState"); + public static final LocationIdentity CLASS_STATE_LOCATION = LocationNode.createLocation("ClassState"); @Fold public static int klassStateOffset() { @@ -523,14 +524,14 @@ return config().klassInstanceSizeOffset; } - public static final Object HEAP_TOP_LOCATION = LocationNode.createLocation("HeapTop"); + public static final LocationIdentity HEAP_TOP_LOCATION = LocationNode.createLocation("HeapTop"); @Fold public static long heapTopAddress() { return config().heapTopAddress; } - public static final Object HEAP_END_LOCATION = LocationNode.createLocation("HeapEnd"); + public static final LocationIdentity HEAP_END_LOCATION = LocationNode.createLocation("HeapEnd"); @Fold public static long heapEndAddress() { @@ -552,42 +553,42 @@ return config().tlabAlignmentReserve; } - public static final Object TLAB_SIZE_LOCATION = LocationNode.createLocation("TlabSize"); + public static final LocationIdentity TLAB_SIZE_LOCATION = LocationNode.createLocation("TlabSize"); @Fold public static int threadTlabSizeOffset() { return config().threadTlabSizeOffset; } - public static final Object TLAB_THREAD_ALLOCATED_BYTES_LOCATION = LocationNode.createLocation("TlabThreadAllocatedBytes"); + public static final LocationIdentity TLAB_THREAD_ALLOCATED_BYTES_LOCATION = LocationNode.createLocation("TlabThreadAllocatedBytes"); @Fold public static int threadAllocatedBytesOffset() { return config().threadAllocatedBytesOffset; } - public static final Object TLAB_REFILL_WASTE_LIMIT_LOCATION = LocationNode.createLocation("RefillWasteLimit"); + public static final LocationIdentity TLAB_REFILL_WASTE_LIMIT_LOCATION = LocationNode.createLocation("RefillWasteLimit"); @Fold public static int tlabRefillWasteLimitOffset() { return config().tlabRefillWasteLimitOffset; } - public static final Object TLAB_NOF_REFILLS_LOCATION = LocationNode.createLocation("TlabNOfRefills"); + public static final LocationIdentity TLAB_NOF_REFILLS_LOCATION = LocationNode.createLocation("TlabNOfRefills"); @Fold public static int tlabNumberOfRefillsOffset() { return config().tlabNumberOfRefillsOffset; } - public static final Object TLAB_FAST_REFILL_WASTE_LOCATION = LocationNode.createLocation("TlabFastRefillWaste"); + public static final LocationIdentity TLAB_FAST_REFILL_WASTE_LOCATION = LocationNode.createLocation("TlabFastRefillWaste"); @Fold public static int tlabFastRefillWasteOffset() { return config().tlabFastRefillWasteOffset; } - public static final Object TLAB_SLOW_ALLOCATIONS_LOCATION = LocationNode.createLocation("TlabSlowAllocations"); + public static final LocationIdentity TLAB_SLOW_ALLOCATIONS_LOCATION = LocationNode.createLocation("TlabSlowAllocations"); @Fold public static int tlabSlowAllocationsOffset() { diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MonitorSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MonitorSnippets.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MonitorSnippets.java Thu May 02 12:12:51 2013 -0700 @@ -41,6 +41,7 @@ import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; import com.oracle.graal.nodes.spi.*; @@ -344,7 +345,7 @@ */ private static final boolean ENABLE_BREAKPOINT = false; - private static final Object MONITOR_COUNTER_LOCATION = LocationNode.createLocation("MonitorCounter"); + private static final LocationIdentity MONITOR_COUNTER_LOCATION = LocationNode.createLocation("MonitorCounter"); @NodeIntrinsic(BreakpointNode.class) static native void bkpt(Object object, Word mark, Word tmp, Word value); diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/TypeCheckSnippetUtils.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/TypeCheckSnippetUtils.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/TypeCheckSnippetUtils.java Thu May 02 12:12:51 2013 -0700 @@ -33,6 +33,7 @@ import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.phases.*; import com.oracle.graal.replacements.*; import com.oracle.graal.word.*; @@ -44,7 +45,7 @@ */ public class TypeCheckSnippetUtils { - public static final Object TYPE_DISPLAY_LOCATION = LocationNode.createLocation("TypeDisplay"); + public static final LocationIdentity TYPE_DISPLAY_LOCATION = LocationNode.createLocation("TypeDisplay"); static boolean checkSecondarySubType(Word t, Word s) { // if (S.cache == T) return true diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Thu May 02 12:12:51 2013 -0700 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.util.*; @@ -88,8 +89,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Thu May 02 12:12:51 2013 -0700 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.util.*; @@ -151,8 +152,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } public FrameState stateDuring() { diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java Thu May 02 12:12:51 2013 -0700 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; /** * The start node of a graph. @@ -30,7 +31,7 @@ public class StartNode extends BeginStateSplitNode implements MemoryCheckpoint { @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } } diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java Thu May 02 12:12:51 2013 -0700 @@ -64,7 +64,7 @@ } @Override - public Object getLocationIdentity() { + public LocationIdentity getLocationIdentity() { return getX().getLocationIdentity(); } diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Thu May 02 12:12:51 2013 -0700 @@ -35,14 +35,14 @@ public final class ConstantLocationNode extends LocationNode { private final Kind valueKind; - private final Object locationIdentity; + private final LocationIdentity locationIdentity; private final long displacement; - public static ConstantLocationNode create(Object identity, Kind kind, long displacement, Graph graph) { + public static ConstantLocationNode create(LocationIdentity identity, Kind kind, long displacement, Graph graph) { return graph.unique(new ConstantLocationNode(identity, kind, displacement)); } - private ConstantLocationNode(Object identity, Kind kind, long displacement) { + private ConstantLocationNode(LocationIdentity identity, Kind kind, long displacement) { super(StampFactory.extension()); assert kind != Kind.Illegal && kind != Kind.Void; this.valueKind = kind; @@ -56,7 +56,7 @@ } @Override - public Object getLocationIdentity() { + public LocationIdentity getLocationIdentity() { return locationIdentity; } diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Thu May 02 12:12:51 2013 -0700 @@ -37,7 +37,7 @@ public final class IndexedLocationNode extends LocationNode implements Canonicalizable { private final Kind valueKind; - private final Object locationIdentity; + private final LocationIdentity locationIdentity; private final long displacement; @Input private ValueNode index; private final int indexScaling; @@ -60,11 +60,11 @@ return indexScaling; } - public static IndexedLocationNode create(Object identity, Kind kind, long displacement, ValueNode index, Graph graph, int indexScaling) { + public static IndexedLocationNode create(LocationIdentity identity, Kind kind, long displacement, ValueNode index, Graph graph, int indexScaling) { return graph.unique(new IndexedLocationNode(identity, kind, displacement, index, indexScaling)); } - private IndexedLocationNode(Object identity, Kind kind, long displacement, ValueNode index, int indexScaling) { + private IndexedLocationNode(LocationIdentity identity, Kind kind, long displacement, ValueNode index, int indexScaling) { super(StampFactory.extension()); assert kind != Kind.Illegal && kind != Kind.Void; this.valueKind = kind; @@ -80,7 +80,7 @@ } @Override - public Object getLocationIdentity() { + public LocationIdentity getLocationIdentity() { return locationIdentity; } diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Thu May 02 12:12:51 2013 -0700 @@ -22,6 +22,8 @@ */ package com.oracle.graal.nodes.extended; +import java.util.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.Node.ValueNumberable; import com.oracle.graal.nodes.calc.*; @@ -36,13 +38,33 @@ public abstract class LocationNode extends FloatingNode implements LIRLowerable, ValueNumberable { /** + * Marker interface for location identities. Apart from the special values {@link #ANY_LOCATION} + * and {@link #FINAL_LOCATION}, a different location identity of two memory accesses guarantees + * that the two accesses do not interfere. + */ + public interface LocationIdentity { + } + + /** + * Denotes any location. A write to such a location kills all values in a memory map during an + * analysis of memory accesses in a graph. A read from this location cannot be moved or + * coalesced with other reads because its interaction with other reads is not known. + */ + public static final LocationIdentity ANY_LOCATION = createLocation("ANY_LOCATION"); + + /** + * Denotes the location of a value that is guaranteed to be final. + */ + public static final LocationIdentity FINAL_LOCATION = createLocation("FINAL_LOCATION"); + + /** * Creates a new unique location identity for read and write operations. * * @param name the name of the new location identity, for debugging purposes * @return the new location identity */ - public static Object createLocation(final String name) { - return new Object() { + public static LocationIdentity createLocation(final String name) { + return new LocationIdentity() { @Override public String toString() { @@ -52,16 +74,23 @@ } /** - * Denotes any location. A write to such a location kills all values in a memory map during an - * analysis of memory accesses in a graph. A read from this location cannot be moved or - * coalesced with other reads because its interaction with other reads is not known. + * Returns the location identity for an array of the given element kind. Array accesses of the + * same kind must have the same location identity unless an alias analysis guarantees that two + * distinct arrays are accessed. */ - public static final Object ANY_LOCATION = createLocation("ANY_LOCATION"); + public static LocationIdentity getArrayLocation(Kind elementKind) { + return ARRAY_LOCATIONS.get(elementKind); + } + + private static final EnumMap ARRAY_LOCATIONS = initArrayLocations(); - /** - * Denotes the location of a value that is guaranteed to be final. - */ - public static final Object FINAL_LOCATION = createLocation("FINAL_LOCATION"); + private static EnumMap initArrayLocations() { + EnumMap result = new EnumMap<>(Kind.class); + for (Kind kind : Kind.values()) { + result.put(kind, createLocation("Array: " + kind.getJavaName())); + } + return result; + } /** * Marker interface for locations in snippets. @@ -69,10 +98,6 @@ public interface Location { } - public static Object getArrayLocation(Kind elementKind) { - return elementKind; - } - protected LocationNode(Stamp stamp) { super(stamp); } @@ -83,11 +108,9 @@ public abstract Kind getValueKind(); /** - * Returns the identity of the accessed memory location. Apart from the special values - * {@link #ANY_LOCATION} and {@link #FINAL_LOCATION}, a different location identity of two - * memory accesses guarantees that the two accesses do not interfere. + * Returns the identity of the accessed memory location. */ - public abstract Object getLocationIdentity(); + public abstract LocationIdentity getLocationIdentity(); @Override public final void generate(LIRGeneratorTool generator) { diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Thu May 02 12:12:51 2013 -0700 @@ -31,6 +31,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -50,8 +51,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java Thu May 02 12:12:51 2013 -0700 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; /** * This interface marks is used for subclasses of {@link FixedNode} that kill a set of memory @@ -37,6 +38,6 @@ * * @return the identities of all locations killed by this node. */ - Object[] getLocationIdentities(); + LocationIdentity[] getLocationIdentities(); } diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Thu May 02 12:12:51 2013 -0700 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -43,7 +44,7 @@ super(object, location, stamp, dependencies); } - private ReadNode(ValueNode object, int displacement, Object locationIdentity, Kind kind) { + private ReadNode(ValueNode object, int displacement, LocationIdentity locationIdentity, Kind kind) { super(object, ConstantLocationNode.create(locationIdentity, kind, displacement, object.graph()), StampFactory.forKind(kind)); } @@ -101,7 +102,7 @@ @Override public boolean push(PiNode parent) { - Object locId = location().getLocationIdentity(); + LocationIdentity locId = location().getLocationIdentity(); if (locId instanceof ResolvedJavaField) { ResolvedJavaType fieldType = ((ResolvedJavaField) locId).getDeclaringClass(); ValueNode piValueStamp = parent.object(); @@ -128,5 +129,5 @@ * @return the value read from memory */ @NodeIntrinsic(setStampFromReturnType = true) - public static native T read(Object base, @ConstantNodeParameter int displacement, @ConstantNodeParameter Object locationIdentity, @ConstantNodeParameter Kind kind); + public static native T read(Object base, @ConstantNodeParameter int displacement, @ConstantNodeParameter LocationIdentity locationIdentity, @ConstantNodeParameter Kind kind); } diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Thu May 02 12:12:51 2013 -0700 @@ -26,6 +26,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -50,8 +51,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java Thu May 02 12:12:51 2013 -0700 @@ -65,9 +65,9 @@ } @Override - public Object getLocationIdentity() { + public LocationIdentity getLocationIdentity() { if (locationIdentity.isConstant()) { - return locationIdentity.asConstant().asObject(); + return (LocationIdentity) locationIdentity.asConstant().asObject(); } // We do not know our actual location identity yet, so be conservative. return LocationNode.ANY_LOCATION; @@ -77,7 +77,7 @@ public ValueNode canonical(CanonicalizerTool tool) { if (valueKind.isConstant() && locationIdentity.isConstant() && displacement.isConstant() && (indexScaling == null || indexScaling.isConstant())) { Kind constKind = (Kind) valueKind.asConstant().asObject(); - Object constLocation = locationIdentity.asConstant().asObject(); + LocationIdentity constLocation = (LocationIdentity) locationIdentity.asConstant().asObject(); long constDisplacement = displacement.asConstant().asLong(); int constIndexScaling = indexScaling == null ? 0 : indexScaling.asConstant().asInt(); diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Thu May 02 12:12:51 2013 -0700 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -74,8 +75,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java Thu May 02 12:12:51 2013 -0700 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -37,8 +38,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Thu May 02 12:12:51 2013 -0700 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -93,7 +94,7 @@ public static native void writeMemory(Object object, Object value, Object location, @ConstantNodeParameter WriteBarrierType barrierType); @Override - public Object[] getLocationIdentities() { - return new Object[]{location().getLocationIdentity()}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{location().getLocationIdentity()}; } } diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Thu May 02 12:12:51 2013 -0700 @@ -28,7 +28,8 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.extended.WriteNode.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; +import com.oracle.graal.nodes.extended.WriteNode.WriteBarrierType; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -95,8 +96,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Thu May 02 12:12:51 2013 -0700 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -39,8 +40,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java Thu May 02 12:12:51 2013 -0700 @@ -24,6 +24,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; /** @@ -44,8 +45,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java Thu May 02 12:12:51 2013 -0700 @@ -25,6 +25,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; /** @@ -45,8 +46,8 @@ } @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; + public LocationIdentity[] getLocationIdentities() { + return new LocationIdentity[]{LocationNode.ANY_LOCATION}; } @Override diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Thu May 02 12:12:51 2013 -0700 @@ -27,6 +27,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.PhiNode.PhiType; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.phases.*; import com.oracle.graal.phases.graph.*; import com.oracle.graal.phases.graph.ReentrantNodeIterator.LoopInfo; @@ -36,7 +37,7 @@ private static class MemoryMap { - private IdentityHashMap lastMemorySnapshot; + private IdentityHashMap lastMemorySnapshot; public MemoryMap(MemoryMap memoryMap) { lastMemorySnapshot = new IdentityHashMap<>(memoryMap.lastMemorySnapshot); @@ -51,7 +52,7 @@ lastMemorySnapshot = new IdentityHashMap<>(); } - private ValueNode getLastLocationAccess(Object locationIdentity) { + private ValueNode getLastLocationAccess(LocationIdentity locationIdentity) { ValueNode lastLocationAccess; if (locationIdentity == LocationNode.FINAL_LOCATION) { return null; @@ -73,50 +74,50 @@ @Override protected void run(StructuredGraph graph) { - Map> modifiedInLoops = new IdentityHashMap<>(); - ReentrantNodeIterator.apply(new CollectMemoryCheckpointsClosure(modifiedInLoops), graph.start(), new HashSet<>(), null); + Map> modifiedInLoops = new IdentityHashMap<>(); + ReentrantNodeIterator.apply(new CollectMemoryCheckpointsClosure(modifiedInLoops), graph.start(), new HashSet(), null); ReentrantNodeIterator.apply(new FloatingReadClosure(modifiedInLoops), graph.start(), new MemoryMap(graph.start()), null); } - private static class CollectMemoryCheckpointsClosure extends NodeIteratorClosure> { + private static class CollectMemoryCheckpointsClosure extends NodeIteratorClosure> { - private final Map> modifiedInLoops; + private final Map> modifiedInLoops; - public CollectMemoryCheckpointsClosure(Map> modifiedInLoops) { + public CollectMemoryCheckpointsClosure(Map> modifiedInLoops) { this.modifiedInLoops = modifiedInLoops; } @Override - protected void processNode(FixedNode node, Set currentState) { + protected void processNode(FixedNode node, Set currentState) { if (node instanceof MemoryCheckpoint) { - for (Object identity : ((MemoryCheckpoint) node).getLocationIdentities()) { + for (LocationIdentity identity : ((MemoryCheckpoint) node).getLocationIdentities()) { currentState.add(identity); } } } @Override - protected Set merge(MergeNode merge, List> states) { - Set result = new HashSet<>(); - for (Set other : states) { + protected Set merge(MergeNode merge, List> states) { + Set result = new HashSet<>(); + for (Set other : states) { result.addAll(other); } return result; } @Override - protected Set afterSplit(AbstractBeginNode node, Set oldState) { + protected Set afterSplit(AbstractBeginNode node, Set oldState) { return new HashSet<>(oldState); } @Override - protected Map> processLoop(LoopBeginNode loop, Set initialState) { - LoopInfo> loopInfo = ReentrantNodeIterator.processLoop(this, loop, new HashSet<>()); - Set modifiedLocations = new HashSet<>(); - for (Set end : loopInfo.endStates.values()) { + protected Map> processLoop(LoopBeginNode loop, Set initialState) { + LoopInfo> loopInfo = ReentrantNodeIterator.processLoop(this, loop, new HashSet()); + Set modifiedLocations = new HashSet<>(); + for (Set end : loopInfo.endStates.values()) { modifiedLocations.addAll(end); } - for (Set exit : loopInfo.exitStates.values()) { + for (Set exit : loopInfo.exitStates.values()) { exit.addAll(modifiedLocations); exit.addAll(initialState); } @@ -129,9 +130,9 @@ private static class FloatingReadClosure extends NodeIteratorClosure { - private final Map> modifiedInLoops; + private final Map> modifiedInLoops; - public FloatingReadClosure(Map> modifiedInLoops) { + public FloatingReadClosure(Map> modifiedInLoops) { this.modifiedInLoops = modifiedInLoops; } @@ -145,7 +146,7 @@ } private static void processCheckpoint(MemoryCheckpoint checkpoint, MemoryMap state) { - for (Object identity : checkpoint.getLocationIdentities()) { + for (LocationIdentity identity : checkpoint.getLocationIdentities()) { if (identity == LocationNode.ANY_LOCATION) { state.lastMemorySnapshot.clear(); } @@ -156,7 +157,7 @@ private static void processFloatable(FloatableAccessNode accessNode, MemoryMap state) { StructuredGraph graph = (StructuredGraph) accessNode.graph(); assert accessNode.getNullCheck() == false; - Object locationIdentity = accessNode.location().getLocationIdentity(); + LocationIdentity locationIdentity = accessNode.location().getLocationIdentity(); if (locationIdentity != LocationNode.ANY_LOCATION) { ValueNode lastLocationAccess = state.getLastLocationAccess(locationIdentity); FloatingAccessNode floatingNode = accessNode.asFloatingNode(lastLocationAccess); @@ -177,13 +178,13 @@ protected MemoryMap merge(MergeNode merge, List states) { MemoryMap newState = new MemoryMap(); - Set keys = new HashSet<>(); + Set keys = new HashSet<>(); for (MemoryMap other : states) { keys.addAll(other.lastMemorySnapshot.keySet()); } assert !keys.contains(LocationNode.FINAL_LOCATION); - for (Object key : keys) { + for (LocationIdentity key : keys) { int mergedStatesCount = 0; boolean isPhi = false; ValueNode merged = null; @@ -225,7 +226,7 @@ * needs to choose by putting in the location identity on both successors. */ InvokeWithExceptionNode checkpoint = (InvokeWithExceptionNode) node.predecessor(); - for (Object identity : checkpoint.getLocationIdentities()) { + for (LocationIdentity identity : checkpoint.getLocationIdentities()) { result.lastMemorySnapshot.put(identity, node); } } @@ -234,15 +235,15 @@ @Override protected Map processLoop(LoopBeginNode loop, MemoryMap initialState) { - Set modifiedLocations = modifiedInLoops.get(loop); + Set modifiedLocations = modifiedInLoops.get(loop); if (modifiedLocations.contains(LocationNode.ANY_LOCATION)) { // create phis for all locations if ANY is modified in the loop modifiedLocations = new HashSet<>(modifiedLocations); modifiedLocations.addAll(initialState.lastMemorySnapshot.keySet()); } - Map phis = new HashMap<>(); - for (Object location : modifiedLocations) { + Map phis = new HashMap<>(); + for (LocationIdentity location : modifiedLocations) { PhiNode phi = loop.graph().add(new PhiNode(PhiType.Memory, loop, location)); phi.addInput(initialState.getLastLocationAccess(location)); phis.put(location, phi); @@ -253,8 +254,8 @@ for (Map.Entry entry : loopInfo.endStates.entrySet()) { int endIndex = loop.phiPredecessorIndex(entry.getKey()); - for (Map.Entry phiEntry : phis.entrySet()) { - Object key = phiEntry.getKey(); + for (Map.Entry phiEntry : phis.entrySet()) { + LocationIdentity key = phiEntry.getKey(); PhiNode phi = phiEntry.getValue(); phi.initializeValueAt(endIndex, entry.getValue().getLastLocationAccess(key)); } @@ -262,7 +263,7 @@ for (Map.Entry entry : loopInfo.exitStates.entrySet()) { LoopExitNode exit = entry.getKey(); MemoryMap state = entry.getValue(); - for (Object location : modifiedLocations) { + for (LocationIdentity location : modifiedLocations) { ValueNode lastAccessAtExit = state.lastMemorySnapshot.get(location); if (lastAccessAtExit != null) { state.lastMemorySnapshot.put(location, ProxyNode.forMemory(lastAccessAtExit, exit, location, (StructuredGraph) loop.graph())); diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Thu May 02 12:12:51 2013 -0700 @@ -31,6 +31,7 @@ import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.graph.*; @@ -88,7 +89,7 @@ if (node instanceof FloatingReadNode) { currentState.add((FloatingReadNode) node); } else if (node instanceof MemoryCheckpoint) { - for (Object identity : ((MemoryCheckpoint) node).getLocationIdentities()) { + for (LocationIdentity identity : ((MemoryCheckpoint) node).getLocationIdentities()) { for (Iterator iter = currentState.iterator(); iter.hasNext();) { FloatingReadNode read = iter.next(); FixedNode fixed = (FixedNode) node; diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/PointerTest.java --- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/PointerTest.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/PointerTest.java Thu May 02 12:12:51 2013 -0700 @@ -33,6 +33,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.replacements.*; import com.oracle.graal.replacements.Snippet.*; import com.oracle.graal.word.*; @@ -42,7 +43,7 @@ */ public class PointerTest extends GraalCompilerTest implements Snippets { - private static final Object ID = new Object(); + private static final LocationIdentity ID = LocationNode.createLocation("ID"); private static final Kind[] KINDS = new Kind[]{Kind.Byte, Kind.Char, Kind.Short, Kind.Int, Kind.Long, Kind.Float, Kind.Double, Kind.Object}; private final TargetDescription target; private final ReplacementsImpl installer; @@ -102,7 +103,7 @@ } } - private void assertRead(StructuredGraph graph, Kind kind, boolean indexConvert, Object locationIdentity) { + private void assertRead(StructuredGraph graph, Kind kind, boolean indexConvert, LocationIdentity locationIdentity) { ReadNode read = (ReadNode) graph.start().next(); Assert.assertEquals(kind.getStackKind(), read.kind()); @@ -127,7 +128,7 @@ Assert.assertEquals(read, ret.result()); } - private void assertWrite(StructuredGraph graph, Kind kind, boolean indexConvert, Object locationIdentity) { + private void assertWrite(StructuredGraph graph, Kind kind, boolean indexConvert, LocationIdentity locationIdentity) { WriteNode write = (WriteNode) graph.start().next(); Assert.assertEquals(graph.getLocal(2), write.value()); Assert.assertEquals(Kind.Void, write.kind()); diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java Thu May 02 12:12:51 2013 -0700 @@ -29,6 +29,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.Virtualizable.EscapeState; import com.oracle.graal.nodes.virtual.*; @@ -41,10 +42,10 @@ static class ReadCacheEntry { - public final Object identity; + public final LocationIdentity identity; public final ValueNode object; - public ReadCacheEntry(Object identity, ValueNode object) { + public ReadCacheEntry(LocationIdentity identity, ValueNode object) { this.identity = identity; this.object = object; } @@ -82,7 +83,7 @@ readCache = new HashMap<>(other.readCache); } - public void addReadCache(ValueNode object, Object identity, ValueNode value) { + public void addReadCache(ValueNode object, LocationIdentity identity, ValueNode value) { ValueNode cacheObject; ObjectState obj = getObjectState(object); if (obj != null) { @@ -94,7 +95,7 @@ readCache.put(new ReadCacheEntry(identity, cacheObject), value); } - public ValueNode getReadCache(ValueNode object, Object identity) { + public ValueNode getReadCache(ValueNode object, LocationIdentity identity) { ValueNode cacheObject; ObjectState obj = getObjectState(object); if (obj != null) { @@ -114,7 +115,7 @@ return cacheValue; } - public void killReadCache(Object identity) { + public void killReadCache(LocationIdentity identity) { if (identity == LocationNode.ANY_LOCATION) { readCache.clear(); } else { @@ -186,7 +187,7 @@ if (virtual instanceof VirtualInstanceNode) { VirtualInstanceNode instance = (VirtualInstanceNode) virtual; for (int i = 0; i < entries.length; i++) { - readCache.put(new ReadCacheEntry(instance.field(i), representation), values.get(pos + i)); + readCache.put(new ReadCacheEntry((LocationIdentity) instance.field(i), representation), values.get(pos + i)); } } } else { diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Thu May 02 12:12:51 2013 -0700 @@ -34,6 +34,7 @@ import com.oracle.graal.nodes.PhiNode.PhiType; import com.oracle.graal.nodes.VirtualState.NodeClosure; import com.oracle.graal.nodes.cfg.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; @@ -158,18 +159,18 @@ if (node instanceof StoreFieldNode) { METRIC_STOREFIELD_RECORDED.increment(); StoreFieldNode store = (StoreFieldNode) node; - ValueNode cachedValue = state.getReadCache(store.object(), store.field()); - state.killReadCache(store.field()); + ValueNode cachedValue = state.getReadCache(store.object(), (LocationIdentity) store.field()); + state.killReadCache((LocationIdentity) store.field()); if (cachedValue == store.value()) { effects.deleteFixedNode(store); changed = true; } else { - state.addReadCache(store.object(), store.field(), store.value()); + state.addReadCache(store.object(), (LocationIdentity) store.field(), store.value()); } } else if (node instanceof LoadFieldNode) { LoadFieldNode load = (LoadFieldNode) node; - ValueNode cachedValue = state.getReadCache(load.object(), load.field()); + ValueNode cachedValue = state.getReadCache(load.object(), (LocationIdentity) load.field()); if (cachedValue != null) { METRIC_LOADFIELD_ELIMINATED.increment(); effects.replaceAtUsages(load, cachedValue); @@ -177,12 +178,12 @@ changed = true; } else { METRIC_LOADFIELD_NOT_ELIMINATED.increment(); - state.addReadCache(load.object(), load.field(), load); + state.addReadCache(load.object(), (LocationIdentity) load.field(), load); } } else if (node instanceof MemoryCheckpoint) { METRIC_MEMORYCHECKOINT.increment(); MemoryCheckpoint checkpoint = (MemoryCheckpoint) node; - for (Object identity : checkpoint.getLocationIdentities()) { + for (LocationIdentity identity : checkpoint.getLocationIdentities()) { state.killReadCache(identity); } } @@ -703,7 +704,7 @@ } } - private void mergeReadCachePhi(PhiNode phi, Object identity, List states) { + private void mergeReadCachePhi(PhiNode phi, LocationIdentity identity, List states) { ValueNode[] values = new ValueNode[phi.valueCount()]; for (int i = 0; i < phi.valueCount(); i++) { ValueNode value = states.get(i).getReadCache(phi.valueAt(i), identity); diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.word/src/com/oracle/graal/word/Pointer.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/Pointer.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/Pointer.java Thu May 02 12:12:51 2013 -0700 @@ -23,6 +23,7 @@ package com.oracle.graal.word; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; public interface Pointer extends Unsigned { @@ -47,7 +48,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - byte readByte(WordBase offset, Object locationIdentity); + byte readByte(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -61,7 +62,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - char readChar(WordBase offset, Object locationIdentity); + char readChar(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -75,7 +76,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - short readShort(WordBase offset, Object locationIdentity); + short readShort(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -89,7 +90,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - int readInt(WordBase offset, Object locationIdentity); + int readInt(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -103,7 +104,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - long readLong(WordBase offset, Object locationIdentity); + long readLong(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -117,7 +118,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - float readFloat(WordBase offset, Object locationIdentity); + float readFloat(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -131,7 +132,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - double readDouble(WordBase offset, Object locationIdentity); + double readDouble(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -145,7 +146,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - Word readWord(WordBase offset, Object locationIdentity); + Word readWord(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -159,7 +160,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - Object readObject(WordBase offset, Object locationIdentity); + Object readObject(WordBase offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -169,7 +170,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - byte readByte(int offset, Object locationIdentity); + byte readByte(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -179,7 +180,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - char readChar(int offset, Object locationIdentity); + char readChar(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -189,7 +190,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - short readShort(int offset, Object locationIdentity); + short readShort(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -199,7 +200,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - int readInt(int offset, Object locationIdentity); + int readInt(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -209,7 +210,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - long readLong(int offset, Object locationIdentity); + long readLong(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -219,7 +220,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - float readFloat(int offset, Object locationIdentity); + float readFloat(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -229,7 +230,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - double readDouble(int offset, Object locationIdentity); + double readDouble(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -239,7 +240,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - Word readWord(int offset, Object locationIdentity); + Word readWord(int offset, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -249,7 +250,7 @@ * @param locationIdentity the identity of the read (see {@link LocationNode}) * @return the result of the memory access */ - Object readObject(int offset, Object locationIdentity); + Object readObject(int offset, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -263,7 +264,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeByte(WordBase offset, byte val, Object locationIdentity); + void writeByte(WordBase offset, byte val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -277,7 +278,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeChar(WordBase offset, char val, Object locationIdentity); + void writeChar(WordBase offset, char val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -291,7 +292,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeShort(WordBase offset, short val, Object locationIdentity); + void writeShort(WordBase offset, short val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -305,7 +306,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeInt(WordBase offset, int val, Object locationIdentity); + void writeInt(WordBase offset, int val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -319,7 +320,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeLong(WordBase offset, long val, Object locationIdentity); + void writeLong(WordBase offset, long val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -333,7 +334,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeFloat(WordBase offset, float val, Object locationIdentity); + void writeFloat(WordBase offset, float val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -347,7 +348,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeDouble(WordBase offset, double val, Object locationIdentity); + void writeDouble(WordBase offset, double val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -361,7 +362,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeWord(WordBase offset, WordBase val, Object locationIdentity); + void writeWord(WordBase offset, WordBase val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -375,7 +376,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeObject(WordBase offset, Object val, Object locationIdentity); + void writeObject(WordBase offset, Object val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -385,7 +386,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeByte(int offset, byte val, Object locationIdentity); + void writeByte(int offset, byte val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -395,7 +396,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeChar(int offset, char val, Object locationIdentity); + void writeChar(int offset, char val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -405,7 +406,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeShort(int offset, short val, Object locationIdentity); + void writeShort(int offset, short val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -415,7 +416,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeInt(int offset, int val, Object locationIdentity); + void writeInt(int offset, int val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -425,7 +426,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeLong(int offset, long val, Object locationIdentity); + void writeLong(int offset, long val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -435,7 +436,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeFloat(int offset, float val, Object locationIdentity); + void writeFloat(int offset, float val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -445,7 +446,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeDouble(int offset, double val, Object locationIdentity); + void writeDouble(int offset, double val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -455,7 +456,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeWord(int offset, WordBase val, Object locationIdentity); + void writeWord(int offset, WordBase val, LocationIdentity locationIdentity); /** * Writes the memory at address {@code (this + offset)}. Both the base address and offset are in @@ -465,7 +466,7 @@ * @param locationIdentity the identity of the write (see {@link LocationNode}) * @param val the value to be written to memory */ - void writeObject(int offset, Object val, Object locationIdentity); + void writeObject(int offset, Object val, LocationIdentity locationIdentity); /** * Reads the memory at address {@code (this + offset)}. Both the base address and offset are in diff -r 038fa65cbd8d -r ae5cd887e67c graal/com.oracle.graal.word/src/com/oracle/graal/word/Word.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/Word.java Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/Word.java Thu May 02 12:12:51 2013 -0700 @@ -30,6 +30,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; public abstract class Word implements Signed, Unsigned, Pointer { @@ -601,215 +602,215 @@ @Override @Operation(opcode = Opcode.READ) - public byte readByte(WordBase offset, Object locationIdentity) { + public byte readByte(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getByte(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public char readChar(WordBase offset, Object locationIdentity) { + public char readChar(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getChar(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public short readShort(WordBase offset, Object locationIdentity) { + public short readShort(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getShort(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public int readInt(WordBase offset, Object locationIdentity) { + public int readInt(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getInt(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public long readLong(WordBase offset, Object locationIdentity) { + public long readLong(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getLong(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public float readFloat(WordBase offset, Object locationIdentity) { + public float readFloat(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getFloat(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public double readDouble(WordBase offset, Object locationIdentity) { + public double readDouble(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getDouble(add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public Word readWord(WordBase offset, Object locationIdentity) { + public Word readWord(WordBase offset, LocationIdentity locationIdentity) { return box(unsafe.getAddress(add((Word) offset).unbox())); } @Override @Operation(opcode = Opcode.READ) - public Object readObject(WordBase offset, Object locationIdentity) { + public Object readObject(WordBase offset, LocationIdentity locationIdentity) { return unsafe.getObject(null, add((Word) offset).unbox()); } @Override @Operation(opcode = Opcode.READ) - public byte readByte(int offset, Object locationIdentity) { + public byte readByte(int offset, LocationIdentity locationIdentity) { return readByte(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public char readChar(int offset, Object locationIdentity) { + public char readChar(int offset, LocationIdentity locationIdentity) { return readChar(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public short readShort(int offset, Object locationIdentity) { + public short readShort(int offset, LocationIdentity locationIdentity) { return readShort(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public int readInt(int offset, Object locationIdentity) { + public int readInt(int offset, LocationIdentity locationIdentity) { return readInt(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public long readLong(int offset, Object locationIdentity) { + public long readLong(int offset, LocationIdentity locationIdentity) { return readLong(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public float readFloat(int offset, Object locationIdentity) { + public float readFloat(int offset, LocationIdentity locationIdentity) { return readFloat(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public double readDouble(int offset, Object locationIdentity) { + public double readDouble(int offset, LocationIdentity locationIdentity) { return readDouble(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public Word readWord(int offset, Object locationIdentity) { + public Word readWord(int offset, LocationIdentity locationIdentity) { return readWord(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.READ) - public Object readObject(int offset, Object locationIdentity) { + public Object readObject(int offset, LocationIdentity locationIdentity) { return readObject(signed(offset), locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeByte(WordBase offset, byte val, Object locationIdentity) { + public void writeByte(WordBase offset, byte val, LocationIdentity locationIdentity) { unsafe.putByte(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeChar(WordBase offset, char val, Object locationIdentity) { + public void writeChar(WordBase offset, char val, LocationIdentity locationIdentity) { unsafe.putChar(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeShort(WordBase offset, short val, Object locationIdentity) { + public void writeShort(WordBase offset, short val, LocationIdentity locationIdentity) { unsafe.putShort(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeInt(WordBase offset, int val, Object locationIdentity) { + public void writeInt(WordBase offset, int val, LocationIdentity locationIdentity) { unsafe.putInt(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeLong(WordBase offset, long val, Object locationIdentity) { + public void writeLong(WordBase offset, long val, LocationIdentity locationIdentity) { unsafe.putLong(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeFloat(WordBase offset, float val, Object locationIdentity) { + public void writeFloat(WordBase offset, float val, LocationIdentity locationIdentity) { unsafe.putFloat(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeDouble(WordBase offset, double val, Object locationIdentity) { + public void writeDouble(WordBase offset, double val, LocationIdentity locationIdentity) { unsafe.putDouble(add((Word) offset).unbox(), val); } @Override @Operation(opcode = Opcode.WRITE) - public void writeWord(WordBase offset, WordBase val, Object locationIdentity) { + public void writeWord(WordBase offset, WordBase val, LocationIdentity locationIdentity) { unsafe.putAddress(add((Word) offset).unbox(), ((Word) val).unbox()); } @Override @Operation(opcode = Opcode.WRITE) - public native void writeObject(WordBase offset, Object val, Object locationIdentity); + public native void writeObject(WordBase offset, Object val, LocationIdentity locationIdentity); @Override @Operation(opcode = Opcode.WRITE) - public void writeByte(int offset, byte val, Object locationIdentity) { + public void writeByte(int offset, byte val, LocationIdentity locationIdentity) { writeByte(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeChar(int offset, char val, Object locationIdentity) { + public void writeChar(int offset, char val, LocationIdentity locationIdentity) { writeChar(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeShort(int offset, short val, Object locationIdentity) { + public void writeShort(int offset, short val, LocationIdentity locationIdentity) { writeShort(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeInt(int offset, int val, Object locationIdentity) { + public void writeInt(int offset, int val, LocationIdentity locationIdentity) { writeInt(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeLong(int offset, long val, Object locationIdentity) { + public void writeLong(int offset, long val, LocationIdentity locationIdentity) { writeLong(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeFloat(int offset, float val, Object locationIdentity) { + public void writeFloat(int offset, float val, LocationIdentity locationIdentity) { writeFloat(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeDouble(int offset, double val, Object locationIdentity) { + public void writeDouble(int offset, double val, LocationIdentity locationIdentity) { writeDouble(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeWord(int offset, WordBase val, Object locationIdentity) { + public void writeWord(int offset, WordBase val, LocationIdentity locationIdentity) { writeWord(signed(offset), val, locationIdentity); } @Override @Operation(opcode = Opcode.WRITE) - public void writeObject(int offset, Object val, Object locationIdentity) { + public void writeObject(int offset, Object val, LocationIdentity locationIdentity) { writeObject(signed(offset), val, locationIdentity); } diff -r 038fa65cbd8d -r ae5cd887e67c 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 Thu May 02 10:38:48 2013 -0700 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Thu May 02 12:12:51 2013 -0700 @@ -29,7 +29,8 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.extended.WriteNode.*; +import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; +import com.oracle.graal.nodes.extended.WriteNode.WriteBarrierType; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.util.*; @@ -159,14 +160,14 @@ case READ: assert arguments.size() == 2 || arguments.size() == 3; Kind readKind = asKind(callTargetNode.returnType()); - Object readLocation = arguments.size() == 2 ? LocationNode.ANY_LOCATION : arguments.get(2).asConstant().asObject(); + LocationIdentity readLocation = arguments.size() == 2 ? LocationNode.ANY_LOCATION : (LocationIdentity) arguments.get(2).asConstant().asObject(); replace(invoke, readOp(graph, arguments.get(0), arguments.get(1), invoke, readKind, readLocation)); break; case WRITE: assert arguments.size() == 3 || arguments.size() == 4; Kind writeKind = asKind(targetMethod.getSignature().getParameterType(1, targetMethod.getDeclaringClass())); - Object writeLocation = arguments.size() == 3 ? LocationNode.ANY_LOCATION : arguments.get(3).asConstant().asObject(); + LocationIdentity writeLocation = arguments.size() == 3 ? LocationNode.ANY_LOCATION : (LocationIdentity) arguments.get(3).asConstant().asObject(); replace(invoke, writeOp(graph, arguments.get(0), arguments.get(1), arguments.get(2), invoke, writeKind, writeLocation)); break; @@ -284,7 +285,7 @@ return materialize; } - private static ValueNode readOp(StructuredGraph graph, ValueNode base, ValueNode offset, Invoke invoke, Kind readKind, Object locationIdentity) { + private static ValueNode readOp(StructuredGraph graph, ValueNode base, ValueNode offset, Invoke invoke, Kind readKind, LocationIdentity locationIdentity) { IndexedLocationNode location = IndexedLocationNode.create(locationIdentity, readKind, 0, offset, graph, 1); ReadNode read = graph.add(new ReadNode(base, location, invoke.asNode().stamp())); graph.addBeforeFixed(invoke.asNode(), read); @@ -294,7 +295,7 @@ return read; } - private static ValueNode writeOp(StructuredGraph graph, ValueNode base, ValueNode offset, ValueNode value, Invoke invoke, Kind writeKind, Object locationIdentity) { + private static ValueNode writeOp(StructuredGraph graph, ValueNode base, ValueNode offset, ValueNode value, Invoke invoke, Kind writeKind, LocationIdentity locationIdentity) { IndexedLocationNode location = IndexedLocationNode.create(locationIdentity, writeKind, 0, offset, graph, 1); WriteNode write = graph.add(new WriteNode(base, value, location, WriteBarrierType.NONE)); write.setStateAfter(invoke.stateAfter());