# HG changeset patch # User Tom Rodriguez # Date 1397064824 25200 # Node ID 631ca3972292a4a50e4b2a844658111c5cc9dac3 # Parent 5f6603f00e4957b6628407d3b1033e5d20fa7015 Allow Unsafe operations on Java to use precise LocationIdentity and improve address formation diff -r 5f6603f00e49 -r 631ca3972292 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotLoweringProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotLoweringProvider.java Tue Apr 08 20:13:59 2014 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotLoweringProvider.java Wed Apr 09 10:33:44 2014 -0700 @@ -746,6 +746,14 @@ long displacement = 0; int indexScaling = 1; + boolean signExtend = false; + if (offset instanceof SignExtendNode) { + SignExtendNode extend = (SignExtendNode) offset; + if (extend.getResultBits() == 64) { + signExtend = true; + offset = extend.getInput(); + } + } if (offset instanceof IntegerAddNode) { IntegerAddNode integerAddNode = (IntegerAddNode) offset; if (integerAddNode.y() instanceof ConstantNode) { @@ -770,7 +778,10 @@ } } } - + if (signExtend) { + // If we were using sign extended values before restore the sign extension. + offset = offset.graph().addOrUnique(new SignExtendNode(offset, 64)); + } return IndexedLocationNode.create(locationIdentity, accessKind, displacement, offset, offset.graph(), indexScaling); } diff -r 5f6603f00e49 -r 631ca3972292 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 Tue Apr 08 20:13:59 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java Wed Apr 09 10:33:44 2014 -0700 @@ -78,8 +78,18 @@ } } } + ResolvedJavaType receiverType = ObjectStamp.typeOrNull(object()); + if (receiverType != null && receiverType.isArray()) { + LocationIdentity identity = NamedLocationIdentity.getArrayLocation(receiverType.getComponentType().getKind()); + // Try to build a better location node + ValueNode location = offset(); + return cloneAsArrayAccess(location, identity); + } + return this; } protected abstract ValueNode cloneAsFieldAccess(ResolvedJavaField field); + + protected abstract ValueNode cloneAsArrayAccess(ValueNode location, LocationIdentity identity); } diff -r 5f6603f00e49 -r 631ca3972292 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 Tue Apr 08 20:13:59 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Wed Apr 09 10:33:44 2014 -0700 @@ -79,6 +79,11 @@ return this.graph().add(new LoadFieldNode(object(), field)); } + @Override + protected ValueNode cloneAsArrayAccess(ValueNode location, LocationIdentity identity) { + return this.graph().add(new UnsafeLoadNode(object(), location, accessKind(), identity)); + } + @SuppressWarnings({"unchecked", "unused"}) @NodeIntrinsic public static T load(Object object, long offset, @ConstantNodeParameter Kind kind, @ConstantNodeParameter LocationIdentity locationIdentity) { diff -r 5f6603f00e49 -r 631ca3972292 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 Tue Apr 08 20:13:59 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Wed Apr 09 10:33:44 2014 -0700 @@ -108,6 +108,11 @@ return storeFieldNode; } + @Override + protected ValueNode cloneAsArrayAccess(ValueNode location, LocationIdentity identity) { + return this.graph().add(new UnsafeStoreNode(object(), location, value, accessKind(), identity)); + } + public FrameState getState() { return stateAfter; }