Mercurial > hg > graal-compiler
changeset 15039:631ca3972292
Allow Unsafe operations on Java to use precise LocationIdentity and improve address formation
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Wed, 09 Apr 2014 10:33:44 -0700 |
parents | 5f6603f00e49 |
children | 288c23143d47 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotLoweringProvider.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java |
diffstat | 4 files changed, 32 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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); }
--- 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); }
--- 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> T load(Object object, long offset, @ConstantNodeParameter Kind kind, @ConstantNodeParameter LocationIdentity locationIdentity) {
--- 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; }