# HG changeset patch # User Thomas Wuerthinger # Date 1381101834 -7200 # Node ID 88fb9cba8751838848d9d77dc71c130ed8af2a57 # Parent 09382856ab938a868be6688c5bdd0bc7ae4357ce Simplify handling of unsafe store and unsafe load. diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/BasicPTXTest.java --- a/graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/BasicPTXTest.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/BasicPTXTest.java Mon Oct 07 01:23:54 2013 +0200 @@ -24,7 +24,6 @@ import java.lang.reflect.Method; -import org.junit.Ignore; import org.junit.Test; /** diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java Mon Oct 07 01:23:54 2013 +0200 @@ -157,7 +157,7 @@ } public static Object test5Snippet() throws Exception { - return UnsafeLoadNode.load(wr, 0, useCompressedOops() ? 12 : 16, Kind.Object); + return UnsafeLoadNode.load(wr, useCompressedOops() ? 12 : 16, Kind.Object); } /** @@ -232,7 +232,7 @@ public static Object testUnsafeLoad(Object a, Object b, Object c) throws Exception { final int offset = (c == null ? 0 : ((Integer) c).intValue()); final long displacement = (b == null ? 0 : ((Long) b).longValue()); - return UnsafeLoadNode.load(a, offset, displacement, Kind.Object); + return UnsafeLoadNode.load(a, offset + displacement, Kind.Object); } private HotSpotInstalledCode getInstalledCode(String name) throws Exception { diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Oct 07 01:23:54 2013 +0200 @@ -654,7 +654,7 @@ if (addReadBarrier(load)) { unsafeLoadSnippets.lower(load, tool); } else { - IndexedLocationNode location = IndexedLocationNode.create(ANY_LOCATION, load.accessKind(), load.displacement(), load.offset(), graph, 1); + LocationNode location = createLocation(load); ReadNode memoryRead = graph.add(new ReadNode(load.object(), location, load.stamp(), BarrierType.NONE, compressible)); // An unsafe read must not float outside its block otherwise // it may float above an explicit null check on its object. @@ -664,7 +664,7 @@ } } else if (n instanceof UnsafeStoreNode) { UnsafeStoreNode store = (UnsafeStoreNode) n; - IndexedLocationNode location = IndexedLocationNode.create(ANY_LOCATION, store.accessKind(), store.displacement(), store.offset(), graph, 1); + LocationNode location = createLocation(store); ValueNode object = store.object(); BarrierType barrierType = getUnsafeStoreBarrierType(store); WriteNode write = graph.add(new WriteNode(object, store.value(), location, barrierType, store.value().kind() == Kind.Object)); @@ -857,6 +857,43 @@ } } + private static LocationNode createLocation(UnsafeAccessNode access) { + ValueNode offset = access.offset(); + if (offset.isConstant()) { + long offsetValue = offset.asConstant().asLong(); + return ConstantLocationNode.create(access.getLocationIdentity(), access.accessKind(), offsetValue, access.graph()); + } + + long displacement = 0; + int indexScaling = 1; + if (offset instanceof IntegerAddNode) { + IntegerAddNode integerAddNode = (IntegerAddNode) offset; + if (integerAddNode.y() instanceof ConstantNode) { + displacement = integerAddNode.y().asConstant().asLong(); + offset = integerAddNode.x(); + } + } + + if (offset instanceof LeftShiftNode) { + LeftShiftNode leftShiftNode = (LeftShiftNode) offset; + if (leftShiftNode.y() instanceof ConstantNode) { + long shift = leftShiftNode.y().asConstant().asLong(); + if (shift >= 1 && shift <= 3) { + if (shift == 1) { + indexScaling = 2; + } else if (shift == 2) { + indexScaling = 4; + } else { + indexScaling = 8; + } + offset = leftShiftNode.x(); + } + } + } + + return IndexedLocationNode.create(access.getLocationIdentity(), access.accessKind(), displacement, offset, access.graph(), indexScaling); + } + private static boolean addReadBarrier(UnsafeLoadNode load) { if (useG1GC() && load.graph().getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS && load.object().kind() == Kind.Object && load.accessKind() == Kind.Object && !ObjectStamp.isObjectAlwaysNull(load.object())) { diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AESCryptSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AESCryptSubstitutions.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AESCryptSubstitutions.java Mon Oct 07 01:23:54 2013 +0200 @@ -66,7 +66,7 @@ } private static void crypt(Object rcvr, byte[] in, int inOffset, byte[] out, int outOffset, boolean encrypt) { - Object kObject = UnsafeLoadNode.load(rcvr, 0, kOffset, Kind.Object); + Object kObject = UnsafeLoadNode.load(rcvr, kOffset, Kind.Object); Word kAddr = (Word) Word.fromObject(kObject).add(arrayBaseOffset(Kind.Byte)); Word inAddr = Word.unsigned(GetObjectAddressNode.get(in) + arrayBaseOffset(Kind.Byte) + inOffset); Word outAddr = Word.unsigned(GetObjectAddressNode.get(out) + arrayBaseOffset(Kind.Byte) + outOffset); diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java Mon Oct 07 01:23:54 2013 +0200 @@ -62,7 +62,7 @@ @MethodSubstitution(isStatic = false) static void encrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { - Object embeddedCipher = UnsafeLoadNode.load(rcvr, 0, embeddedCipherOffset, Kind.Object); + Object embeddedCipher = UnsafeLoadNode.load(rcvr, embeddedCipherOffset, Kind.Object); if (getAESCryptClass().isInstance(embeddedCipher)) { crypt(rcvr, in, inOffset, inLength, out, outOffset, embeddedCipher, true); } else { @@ -72,7 +72,7 @@ @MethodSubstitution(isStatic = false) static void decrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { - Object embeddedCipher = UnsafeLoadNode.load(rcvr, 0, embeddedCipherOffset, Kind.Object); + Object embeddedCipher = UnsafeLoadNode.load(rcvr, embeddedCipherOffset, Kind.Object); if (in != out && getAESCryptClass().isInstance(embeddedCipher)) { crypt(rcvr, in, inOffset, inLength, out, outOffset, embeddedCipher, false); } else { @@ -81,8 +81,8 @@ } private static void crypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset, Object embeddedCipher, boolean encrypt) { - Object kObject = UnsafeLoadNode.load(embeddedCipher, 0, AESCryptSubstitutions.kOffset, Kind.Object); - Object rObject = UnsafeLoadNode.load(rcvr, 0, rOffset, Kind.Object); + Object kObject = UnsafeLoadNode.load(embeddedCipher, AESCryptSubstitutions.kOffset, Kind.Object); + Object rObject = UnsafeLoadNode.load(rcvr, rOffset, Kind.Object); Word kAddr = (Word) Word.fromObject(kObject).add(arrayBaseOffset(Kind.Byte)); Word rAddr = (Word) Word.fromObject(rObject).add(arrayBaseOffset(Kind.Byte)); Word inAddr = Word.unsigned(GetObjectAddressNode.get(in) + arrayBaseOffset(Kind.Byte) + inOffset); diff -r 09382856ab93 -r 88fb9cba8751 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 Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Mon Oct 07 01:23:54 2013 +0200 @@ -481,7 +481,7 @@ public static Word loadWordFromObject(Object object, int offset) { assert offset != hubOffset() : "Use loadHubIntrinsic instead"; - return loadWordFromObjectIntrinsic(object, 0, offset, getWordKind()); + return loadWordFromObjectIntrinsic(object, offset, getWordKind()); } @NodeIntrinsic(value = ReadRegisterNode.class, setStampFromReturnType = true) @@ -489,8 +489,8 @@ @SuppressWarnings("unused") @NodeIntrinsic(value = UnsafeLoadNode.class, setStampFromReturnType = true) - private static Word loadWordFromObjectIntrinsic(Object object, @ConstantNodeParameter int displacement, long offset, @ConstantNodeParameter Kind wordKind) { - return Word.unsigned(unsafeReadWord(object, offset + displacement)); + private static Word loadWordFromObjectIntrinsic(Object object, long offset, @ConstantNodeParameter Kind wordKind) { + return Word.unsigned(unsafeReadWord(object, offset)); } @SuppressWarnings("unused") diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopySnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopySnippets.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopySnippets.java Mon Oct 07 01:23:54 2013 +0200 @@ -86,42 +86,42 @@ for (long i = 0; i < postLoopBytes; i += elementSize) { srcOffset -= elementSize; destOffset -= elementSize; - Object a = UnsafeLoadNode.load(src, arrayBaseOffset, srcOffset, baseKind); - UnsafeStoreNode.store(dest, arrayBaseOffset, destOffset, a, baseKind); + Object a = UnsafeLoadNode.load(src, arrayBaseOffset + srcOffset, baseKind); + UnsafeStoreNode.store(dest, arrayBaseOffset + destOffset, a, baseKind); } // Main-loop for (long i = 0; i < mainLoopBytes; i += VECTOR_SIZE) { srcOffset -= VECTOR_SIZE; destOffset -= VECTOR_SIZE; - Long a = UnsafeLoadNode.load(src, arrayBaseOffset, srcOffset, VECTOR_KIND); - UnsafeStoreNode.store(dest, arrayBaseOffset, destOffset, a.longValue(), VECTOR_KIND); + Long a = UnsafeLoadNode.load(src, arrayBaseOffset + srcOffset, VECTOR_KIND); + UnsafeStoreNode.store(dest, arrayBaseOffset + destOffset, a.longValue(), VECTOR_KIND); } // Pre-loop for (long i = 0; i < preLoopBytes; i += elementSize) { srcOffset -= elementSize; destOffset -= elementSize; - Object a = UnsafeLoadNode.load(src, arrayBaseOffset, srcOffset, baseKind); - UnsafeStoreNode.store(dest, arrayBaseOffset, destOffset, a, baseKind); + Object a = UnsafeLoadNode.load(src, arrayBaseOffset + srcOffset, baseKind); + UnsafeStoreNode.store(dest, arrayBaseOffset + destOffset, a, baseKind); } } else { // Pre-loop for (long i = 0; i < preLoopBytes; i += elementSize) { - Object a = UnsafeLoadNode.load(src, arrayBaseOffset, srcOffset, baseKind); - UnsafeStoreNode.store(dest, arrayBaseOffset, destOffset, a, baseKind); + Object a = UnsafeLoadNode.load(src, arrayBaseOffset + srcOffset, baseKind); + UnsafeStoreNode.store(dest, arrayBaseOffset + destOffset, a, baseKind); srcOffset += elementSize; destOffset += elementSize; } // Main-loop for (long i = 0; i < mainLoopBytes; i += VECTOR_SIZE) { - Long a = UnsafeLoadNode.load(src, arrayBaseOffset, srcOffset, VECTOR_KIND); - UnsafeStoreNode.store(dest, arrayBaseOffset, destOffset, a.longValue(), VECTOR_KIND); + Long a = UnsafeLoadNode.load(src, arrayBaseOffset + srcOffset, VECTOR_KIND); + UnsafeStoreNode.store(dest, arrayBaseOffset + destOffset, a.longValue(), VECTOR_KIND); srcOffset += VECTOR_SIZE; destOffset += VECTOR_SIZE; } // Post-loop for (long i = 0; i < postLoopBytes; i += elementSize) { - Object a = UnsafeLoadNode.load(src, arrayBaseOffset, srcOffset, baseKind); - UnsafeStoreNode.store(dest, arrayBaseOffset, destOffset, a, baseKind); + Object a = UnsafeLoadNode.load(src, arrayBaseOffset + srcOffset, baseKind); + UnsafeStoreNode.store(dest, arrayBaseOffset + destOffset, a, baseKind); srcOffset += elementSize; destOffset += elementSize; } @@ -167,13 +167,13 @@ long destOffset = (long) destPos * arrayIndexScale(baseKind); if (src == dest && srcPos < destPos) { // bad aliased case for (long i = byteLength - VECTOR_SIZE; i >= 0; i -= VECTOR_SIZE) { - Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); - UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); + Long a = UnsafeLoadNode.load(src, arrayBaseOffset + i + srcOffset, VECTOR_KIND); + UnsafeStoreNode.store(dest, arrayBaseOffset + i + destOffset, a.longValue(), VECTOR_KIND); } } else { for (long i = 0; i < byteLength; i += VECTOR_SIZE) { - Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); - UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); + Long a = UnsafeLoadNode.load(src, arrayBaseOffset + i + srcOffset, VECTOR_KIND); + UnsafeStoreNode.store(dest, arrayBaseOffset + i + destOffset, a.longValue(), VECTOR_KIND); } } } @@ -187,8 +187,8 @@ long destOffset = (long) destPos * arrayIndexScale(baseKind); if (src == dest && srcPos < destPos) { // bad aliased case for (long i = byteLength - VECTOR_SIZE; i >= 0; i -= VECTOR_SIZE) { - Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); - UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); + Long a = UnsafeLoadNode.load(src, arrayBaseOffset + i + srcOffset, VECTOR_KIND); + UnsafeStoreNode.store(dest, arrayBaseOffset + i + destOffset, a.longValue(), VECTOR_KIND); } } else { for (long i = 0; i < byteLength; i += VECTOR_SIZE) { @@ -197,8 +197,8 @@ * values to be copied atomically, but not long values. For example, on Intel 32-bit * this code is not atomic as long as the vector kind remains Kind.Long. */ - Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); - UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); + Long a = UnsafeLoadNode.load(src, arrayBaseOffset + i + srcOffset, VECTOR_KIND); + UnsafeStoreNode.store(dest, arrayBaseOffset + i + destOffset, a.longValue(), VECTOR_KIND); } } } @@ -213,13 +213,13 @@ if (src == dest && srcPos < destPos) { // bad aliased case long start = (long) (length - 1) * scale; for (long i = start; i >= 0; i -= scale) { - Object a = UnsafeLoadNode.load(src, arrayBaseOffset, i + (long) srcPos * scale, Kind.Object); + Object a = UnsafeLoadNode.load(src, arrayBaseOffset + i + (long) srcPos * scale, Kind.Object); DirectObjectStoreNode.storeObject(dest, arrayBaseOffset, i + (long) destPos * scale, a); } } else { long end = (long) length * scale; for (long i = 0; i < end; i += scale) { - Object a = UnsafeLoadNode.load(src, arrayBaseOffset, i + (long) srcPos * scale, Kind.Object); + Object a = UnsafeLoadNode.load(src, arrayBaseOffset + i + (long) srcPos * scale, Kind.Object); DirectObjectStoreNode.storeObject(dest, arrayBaseOffset, i + (long) destPos * scale, a); } } diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeLoadSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeLoadSnippets.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeLoadSnippets.java Mon Oct 07 01:23:54 2013 +0200 @@ -61,7 +61,6 @@ Arguments args = new Arguments(unsafeLoad, load.graph().getGuardsStage()); args.add("object", load.object()); args.add("offset", load.offset()); - args.add("disp", load.displacement()); template(args).instantiate(runtime, load, DEFAULT_REPLACER, args); } } diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java Mon Oct 07 01:23:54 2013 +0200 @@ -32,26 +32,26 @@ @Input private ValueNode object; @Input private ValueNode offset; - private final int displacement; private final Kind accessKind; + private final LocationIdentity locationIdentity; - public UnsafeAccessNode(Stamp stamp, ValueNode object, int displacement, ValueNode offset, Kind accessKind) { + public UnsafeAccessNode(Stamp stamp, ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity) { super(stamp); assert accessKind != null; this.object = object; - this.displacement = displacement; this.offset = offset; this.accessKind = accessKind; + this.locationIdentity = locationIdentity; + } + + public LocationIdentity getLocationIdentity() { + return locationIdentity; } public ValueNode object() { return object; } - public int displacement() { - return displacement; - } - public ValueNode offset() { return offset; } @@ -62,13 +62,13 @@ @Override public Node canonical(CanonicalizerTool tool) { - if (offset().isConstant()) { + if (this.getLocationIdentity() == LocationIdentity.ANY_LOCATION && offset().isConstant()) { long constantOffset = offset().asConstant().asLong(); // Try to canonicalize to a field access. ResolvedJavaType receiverType = ObjectStamp.typeOrNull(object()); if (receiverType != null) { - ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement() + constantOffset); + ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(constantOffset); // No need for checking that the receiver is non-null. The field access includes // the null check and if a field is found, the offset is so small that this is // never a valid access of an arbitrary address. @@ -76,18 +76,9 @@ return cloneAsFieldAccess(field); } } - - if (constantOffset != 0 && Integer.MAX_VALUE - displacement() >= constantOffset) { - int intDisplacement = (int) (constantOffset + displacement()); - if (constantOffset == intDisplacement) { - return cloneWithZeroOffset(intDisplacement); - } - } } return this; } protected abstract ValueNode cloneAsFieldAccess(ResolvedJavaField field); - - protected abstract ValueNode cloneWithZeroOffset(int intDisplacement); } diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Mon Oct 07 01:23:54 2013 +0200 @@ -36,16 +36,12 @@ */ public class UnsafeLoadNode extends UnsafeAccessNode implements Lowerable, Virtualizable { - public UnsafeLoadNode(ValueNode object, int displacement, ValueNode offset, boolean nonNull) { - this(nonNull ? StampFactory.objectNonNull() : StampFactory.object(), object, displacement, offset, Kind.Object); + public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind) { + this(object, offset, accessKind, LocationIdentity.ANY_LOCATION); } - public UnsafeLoadNode(ValueNode object, int displacement, ValueNode offset, Kind accessKind) { - this(StampFactory.forKind(accessKind.getStackKind()), object, displacement, offset, accessKind); - } - - public UnsafeLoadNode(Stamp stamp, ValueNode object, int displacement, ValueNode offset, Kind accessKind) { - super(stamp, object, displacement, offset, accessKind); + public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity) { + super(StampFactory.forKind(accessKind.getStackKind()), object, offset, accessKind, locationIdentity); } @Override @@ -57,9 +53,9 @@ public void virtualize(VirtualizerTool tool) { State state = tool.getObjectState(object()); if (state != null && state.getState() == EscapeState.Virtual) { - ValueNode indexValue = tool.getReplacedValue(offset()); - if (indexValue.isConstant()) { - long offset = indexValue.asConstant().asLong() + displacement(); + ValueNode offsetValue = tool.getReplacedValue(offset()); + if (offsetValue.isConstant()) { + long offset = offsetValue.asConstant().asLong(); int entryIndex = state.getVirtualObject().entryIndexForOffset(offset); if (entryIndex != -1 && state.getVirtualObject().entryKind(entryIndex) == accessKind()) { tool.replaceWith(state.getEntry(entryIndex)); @@ -73,39 +69,34 @@ return this.graph().add(new LoadFieldNode(object(), field)); } - @Override - protected ValueNode cloneWithZeroOffset(int intDisplacement) { - return graph().add(new UnsafeLoadNode(this.stamp(), object(), intDisplacement, graph().unique(ConstantNode.forInt(0, graph())), accessKind())); - } - @SuppressWarnings("unchecked") @NodeIntrinsic - public static T load(Object object, @ConstantNodeParameter int displacement, long offset, @ConstantNodeParameter Kind kind) { + public static T load(Object object, long offset, @ConstantNodeParameter Kind kind) { if (kind == Kind.Boolean) { - return (T) (Boolean) unsafe.getBoolean(object, displacement + offset); + return (T) (Boolean) unsafe.getBoolean(object, offset); } if (kind == Kind.Byte) { - return (T) (Byte) unsafe.getByte(object, displacement + offset); + return (T) (Byte) unsafe.getByte(object, offset); } if (kind == Kind.Short) { - return (T) (Short) unsafe.getShort(object, displacement + offset); + return (T) (Short) unsafe.getShort(object, offset); } if (kind == Kind.Char) { - return (T) (Character) unsafe.getChar(object, displacement + offset); + return (T) (Character) unsafe.getChar(object, offset); } if (kind == Kind.Int) { - return (T) (Integer) unsafe.getInt(object, displacement + offset); + return (T) (Integer) unsafe.getInt(object, offset); } if (kind == Kind.Float) { - return (T) (Float) unsafe.getFloat(object, displacement + offset); + return (T) (Float) unsafe.getFloat(object, offset); } if (kind == Kind.Long) { - return (T) (Long) unsafe.getLong(object, displacement + offset); + return (T) (Long) unsafe.getLong(object, offset); } if (kind == Kind.Double) { - return (T) (Double) unsafe.getDouble(object, displacement + offset); + return (T) (Double) unsafe.getDouble(object, offset); } assert kind == Kind.Object; - return (T) unsafe.getObject(object, displacement + offset); + return (T) unsafe.getObject(object, offset); } } diff -r 09382856ab93 -r 88fb9cba8751 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 Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Mon Oct 07 01:23:54 2013 +0200 @@ -39,12 +39,12 @@ @Input private ValueNode value; @Input(notDataflow = true) private FrameState stateAfter; - public UnsafeStoreNode(ValueNode object, int displacement, ValueNode offset, ValueNode value, Kind accessKind) { - this(StampFactory.forVoid(), object, displacement, offset, value, accessKind); + public UnsafeStoreNode(ValueNode object, ValueNode offset, ValueNode value, Kind accessKind) { + this(object, offset, value, accessKind, LocationIdentity.ANY_LOCATION); } - public UnsafeStoreNode(Stamp stamp, ValueNode object, int displacement, ValueNode offset, ValueNode value, Kind accessKind) { - super(stamp, object, displacement, offset, accessKind); + public UnsafeStoreNode(ValueNode object, ValueNode offset, ValueNode value, Kind accessKind, LocationIdentity locationIdentity) { + super(StampFactory.forVoid(), object, offset, accessKind, locationIdentity); assert accessKind != Kind.Void && accessKind != Kind.Illegal; this.value = value; } @@ -73,17 +73,12 @@ } @Override - public LocationIdentity getLocationIdentity() { - return LocationIdentity.ANY_LOCATION; - } - - @Override public void virtualize(VirtualizerTool tool) { State state = tool.getObjectState(object()); if (state != null && state.getState() == EscapeState.Virtual) { ValueNode indexValue = tool.getReplacedValue(offset()); if (indexValue.isConstant()) { - long offset = indexValue.asConstant().asLong() + displacement(); + long offset = indexValue.asConstant().asLong(); int entryIndex = state.getVirtualObject().entryIndexForOffset(offset); if (entryIndex != -1 && state.getVirtualObject().entryKind(entryIndex) == accessKind()) { tool.setVirtualEntry(state, entryIndex, value()); @@ -100,13 +95,6 @@ return storeFieldNode; } - @Override - protected ValueNode cloneWithZeroOffset(int intDisplacement) { - UnsafeStoreNode unsafeStoreNode = graph().add(new UnsafeStoreNode(stamp(), object(), intDisplacement, ConstantNode.forInt(0, graph()), value(), accessKind())); - unsafeStoreNode.setStateAfter(stateAfter()); - return unsafeStoreNode; - } - public FrameState getState() { return stateAfter; } @@ -115,55 +103,55 @@ @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, Object value, @ConstantNodeParameter Kind kind) { - unsafe.putObject(object, offset + displacement, value); + public static void store(Object object, long offset, Object value, @ConstantNodeParameter Kind kind) { + unsafe.putObject(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, boolean value, @ConstantNodeParameter Kind kind) { - unsafe.putBoolean(object, offset + displacement, value); + public static void store(Object object, long offset, boolean value, @ConstantNodeParameter Kind kind) { + unsafe.putBoolean(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, byte value, @ConstantNodeParameter Kind kind) { - unsafe.putByte(object, offset + displacement, value); + public static void store(Object object, long offset, byte value, @ConstantNodeParameter Kind kind) { + unsafe.putByte(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, char value, @ConstantNodeParameter Kind kind) { - unsafe.putChar(object, offset + displacement, value); + public static void store(Object object, long offset, char value, @ConstantNodeParameter Kind kind) { + unsafe.putChar(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, double value, @ConstantNodeParameter Kind kind) { - unsafe.putDouble(object, offset + displacement, value); + public static void store(Object object, long offset, double value, @ConstantNodeParameter Kind kind) { + unsafe.putDouble(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, float value, @ConstantNodeParameter Kind kind) { - unsafe.putFloat(object, offset + displacement, value); + public static void store(Object object, long offset, float value, @ConstantNodeParameter Kind kind) { + unsafe.putFloat(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, int value, @ConstantNodeParameter Kind kind) { - unsafe.putInt(object, offset + displacement, value); + public static void store(Object object, long offset, int value, @ConstantNodeParameter Kind kind) { + unsafe.putInt(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, long value, @ConstantNodeParameter Kind kind) { - unsafe.putLong(object, offset + displacement, value); + public static void store(Object object, long offset, long value, @ConstantNodeParameter Kind kind) { + unsafe.putLong(object, offset, value); } @SuppressWarnings("unused") @NodeIntrinsic - public static void store(Object object, @ConstantNodeParameter int displacement, long offset, short value, @ConstantNodeParameter Kind kind) { - unsafe.putShort(object, offset + displacement, value); + public static void store(Object object, long offset, short value, @ConstantNodeParameter Kind kind) { + unsafe.putShort(object, offset, value); } } diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeClassSubstitutions.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeClassSubstitutions.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeClassSubstitutions.java Mon Oct 07 01:23:54 2013 +0200 @@ -64,22 +64,22 @@ @MethodSubstitution private static Node getNode(Node node, long offset) { - return PiNode.piCast(UnsafeLoadNode.load(node, 0, offset, Kind.Object), Node.class, false, false); + return PiNode.piCast(UnsafeLoadNode.load(node, offset, Kind.Object), Node.class, false, false); } @MethodSubstitution private static NodeList getNodeList(Node node, long offset) { - return PiNode.piCast(UnsafeLoadNode.load(node, 0, offset, Kind.Object), NodeList.class, false, false); + return PiNode.piCast(UnsafeLoadNode.load(node, offset, Kind.Object), NodeList.class, false, false); } @MethodSubstitution private static void putNode(Node node, long offset, Node value) { - UnsafeStoreNode.store(node, 0, offset, value, Kind.Object); + UnsafeStoreNode.store(node, offset, value, Kind.Object); } @MethodSubstitution private static void putNodeList(Node node, long offset, NodeList value) { - UnsafeStoreNode.store(node, 0, offset, value, Kind.Object); + UnsafeStoreNode.store(node, offset, value, Kind.Object); } } diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java Mon Oct 07 01:23:54 2013 +0200 @@ -53,7 +53,7 @@ @MethodSubstitution(isStatic = false) public static Object getObject(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { - return UnsafeLoadNode.load(o, 0, offset, Kind.Object); + return UnsafeLoadNode.load(o, offset, Kind.Object); } @MethodSubstitution(isStatic = false) @@ -66,7 +66,7 @@ @MethodSubstitution(isStatic = false) public static void putObject(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, Object x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Object); + UnsafeStoreNode.store(o, offset, x, Kind.Object); } @MethodSubstitution(isStatic = false) @@ -85,7 +85,7 @@ @MethodSubstitution(isStatic = false) public static int getInt(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { - Integer value = UnsafeLoadNode.load(o, 0, offset, Kind.Int); + Integer value = UnsafeLoadNode.load(o, offset, Kind.Int); return value; } @@ -99,7 +99,7 @@ @MethodSubstitution(isStatic = false) public static void putInt(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, int x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Int); + UnsafeStoreNode.store(o, offset, x, Kind.Int); } @MethodSubstitution(isStatic = false) @@ -119,7 +119,7 @@ @MethodSubstitution(isStatic = false) public static boolean getBoolean(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Boolean result = UnsafeLoadNode.load(o, 0, offset, Kind.Boolean); + Boolean result = UnsafeLoadNode.load(o, offset, Kind.Boolean); return result; } @@ -133,7 +133,7 @@ @MethodSubstitution(isStatic = false) public static void putBoolean(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, boolean x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Boolean); + UnsafeStoreNode.store(o, offset, x, Kind.Boolean); } @MethodSubstitution(isStatic = false) @@ -146,7 +146,7 @@ @MethodSubstitution(isStatic = false) public static byte getByte(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Byte result = UnsafeLoadNode.load(o, 0, offset, Kind.Byte); + Byte result = UnsafeLoadNode.load(o, offset, Kind.Byte); return result; } @@ -160,7 +160,7 @@ @MethodSubstitution(isStatic = false) public static void putByte(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, byte x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Byte); + UnsafeStoreNode.store(o, offset, x, Kind.Byte); } @MethodSubstitution(isStatic = false) @@ -173,7 +173,7 @@ @MethodSubstitution(isStatic = false) public static short getShort(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Short result = UnsafeLoadNode.load(o, 0, offset, Kind.Short); + Short result = UnsafeLoadNode.load(o, offset, Kind.Short); return result; } @@ -187,7 +187,7 @@ @MethodSubstitution(isStatic = false) public static void putShort(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, short x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Short); + UnsafeStoreNode.store(o, offset, x, Kind.Short); } @MethodSubstitution(isStatic = false) @@ -200,7 +200,7 @@ @MethodSubstitution(isStatic = false) public static char getChar(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Character result = UnsafeLoadNode.load(o, 0, offset, Kind.Char); + Character result = UnsafeLoadNode.load(o, offset, Kind.Char); return result; } @@ -214,7 +214,7 @@ @MethodSubstitution(isStatic = false) public static void putChar(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, char x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Char); + UnsafeStoreNode.store(o, offset, x, Kind.Char); } @MethodSubstitution(isStatic = false) @@ -227,7 +227,7 @@ @MethodSubstitution(isStatic = false) public static long getLong(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Long result = UnsafeLoadNode.load(o, 0, offset, Kind.Long); + Long result = UnsafeLoadNode.load(o, offset, Kind.Long); return result; } @@ -241,7 +241,7 @@ @MethodSubstitution(isStatic = false) public static void putLong(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, long x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Long); + UnsafeStoreNode.store(o, offset, x, Kind.Long); } @MethodSubstitution(isStatic = false) @@ -261,7 +261,7 @@ @MethodSubstitution(isStatic = false) public static float getFloat(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Float result = UnsafeLoadNode.load(o, 0, offset, Kind.Float); + Float result = UnsafeLoadNode.load(o, offset, Kind.Float); return result; } @@ -275,7 +275,7 @@ @MethodSubstitution(isStatic = false) public static void putFloat(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, float x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Float); + UnsafeStoreNode.store(o, offset, x, Kind.Float); } @MethodSubstitution(isStatic = false) @@ -288,7 +288,7 @@ @MethodSubstitution(isStatic = false) public static double getDouble(@SuppressWarnings("unused") final Object thisObj, Object o, long offset) { @JavacBug(id = 6995200) - Double result = UnsafeLoadNode.load(o, 0, offset, Kind.Double); + Double result = UnsafeLoadNode.load(o, offset, Kind.Double); return result; } @@ -302,7 +302,7 @@ @MethodSubstitution(isStatic = false) public static void putDouble(@SuppressWarnings("unused") final Object thisObj, Object o, long offset, double x) { - UnsafeStoreNode.store(o, 0, offset, x, Kind.Double); + UnsafeStoreNode.store(o, offset, x, Kind.Double); } @MethodSubstitution(isStatic = false) diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameGetNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameGetNode.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameGetNode.java Mon Oct 07 01:23:54 2013 +0200 @@ -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.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; @@ -84,8 +85,9 @@ ValueNode slotIndex = getSlotOffset(1, tool.getRuntime()); loadNode = graph().add(new LoadIndexedNode(loadFieldNode, slotIndex, Kind.Object)); } else { - ValueNode slotOffset = getSlotOffset(Unsafe.ARRAY_LONG_INDEX_SCALE, tool.getRuntime()); - loadNode = graph().add(new UnsafeLoadNode(loadFieldNode, Unsafe.ARRAY_LONG_BASE_OFFSET, slotOffset, getSlotKind())); + ValueNode slotOffset = graph().unique( + new IntegerAddNode(Kind.Long, getSlotOffset(Unsafe.ARRAY_LONG_INDEX_SCALE, tool.getRuntime()), ConstantNode.forLong(Unsafe.ARRAY_LONG_BASE_OFFSET, graph()))); + loadNode = graph().add(new UnsafeLoadNode(loadFieldNode, slotOffset, getSlotKind())); } structuredGraph.replaceFixedWithFixed(this, loadNode); loadFieldNode.lower(tool); diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadNode.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadNode.java Mon Oct 07 01:23:54 2013 +0200 @@ -32,20 +32,20 @@ public final class CustomizedUnsafeLoadNode extends UnsafeLoadNode { @Input private ValueNode condition; - @Input private ValueNode locationIdentity; + @Input private ValueNode customLocationIdentity; - public CustomizedUnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, ValueNode condition, ValueNode locationIdentity) { - super(object, 0, offset, accessKind); + public CustomizedUnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, ValueNode condition, ValueNode customLocationIdentity) { + super(object, offset, accessKind); this.condition = condition; - this.locationIdentity = locationIdentity; + this.customLocationIdentity = customLocationIdentity; } public ValueNode getCondition() { return condition; } - public ValueNode getLocationIdentity() { - return locationIdentity; + public ValueNode getCustomLocationIdentity() { + return customLocationIdentity; } @Override @@ -61,6 +61,6 @@ @SuppressWarnings("unused") @NodeIntrinsic public static T load(Object object, long offset, @ConstantNodeParameter Kind kind, boolean condition, Object locationIdentity) { - return UnsafeLoadNode.load(object, 0, offset, kind); + return UnsafeLoadNode.load(object, offset, kind); } } diff -r 09382856ab93 -r 88fb9cba8751 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeStoreNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeStoreNode.java Sun Oct 06 16:30:25 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeStoreNode.java Mon Oct 07 01:23:54 2013 +0200 @@ -34,7 +34,7 @@ @Input private ValueNode customLocationIdentity; public CustomizedUnsafeStoreNode(ValueNode object, ValueNode offset, ValueNode value, Kind accessKind, ValueNode customLocationIdentity) { - super(object, 0, offset, value, accessKind); + super(object, offset, value, accessKind); this.customLocationIdentity = customLocationIdentity; } @@ -55,54 +55,54 @@ @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, Object value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, boolean value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, byte value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, char value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, double value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, float value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, int value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, long value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } @SuppressWarnings("unused") @NodeIntrinsic public static void store(Object object, long offset, short value, @ConstantNodeParameter Kind kind, Object customLocationIdentity) { - UnsafeStoreNode.store(object, 0, offset, value, kind); + UnsafeStoreNode.store(object, offset, value, kind); } }