Mercurial > hg > truffle
changeset 18689:8923610115c9
Capture worst case element type for Array.newInstance if known
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Mon, 15 Dec 2014 13:10:44 -0800 |
parents | 0eba324e27db |
children | abcff66a23b0 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java |
diffstat | 2 files changed, 19 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java Mon Dec 15 12:56:22 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java Mon Dec 15 13:10:44 2014 -0800 @@ -114,7 +114,7 @@ @Snippet(removeAllFrameStates = true) public static Object[] objectArrayClone(Object[] src) { - Object[] result = (Object[]) DynamicNewArrayNode.newUninitializedArray(GuardingPiNode.guardingNonNull(src.getClass().getComponentType()), src.length); + Object[] result = (Object[]) DynamicNewArrayNode.newUninitializedArray(GuardingPiNode.guardingNonNull(src.getClass().getComponentType()), src.length, Kind.Object); ArrayCopyCallNode.disjointUninitializedArraycopy(src, 0, result, 0, src.length, Kind.Object); return result; }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java Mon Dec 15 12:56:22 2014 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java Mon Dec 15 13:10:44 2014 -0800 @@ -42,27 +42,38 @@ @Input ValueNode elementType; + /** + * A non-null value indicating the worst case element type. Mainly useful for distinguishing + * Object arrays from primitive arrays. + */ + protected final Kind knownElementKind; + public static DynamicNewArrayNode create(ValueNode elementType, ValueNode length) { return new DynamicNewArrayNode(elementType, length); } protected DynamicNewArrayNode(ValueNode elementType, ValueNode length) { - this(elementType, length, true); + this(elementType, length, true, null); } - public static DynamicNewArrayNode create(ValueNode elementType, ValueNode length, boolean fillContents) { - return new DynamicNewArrayNode(elementType, length, fillContents); + public static DynamicNewArrayNode create(ValueNode elementType, ValueNode length, boolean fillContents, Kind knownElementKind) { + return new DynamicNewArrayNode(elementType, length, fillContents, knownElementKind); } - protected DynamicNewArrayNode(ValueNode elementType, ValueNode length, boolean fillContents) { + protected DynamicNewArrayNode(ValueNode elementType, ValueNode length, boolean fillContents, Kind knownElementKind) { super(StampFactory.objectNonNull(), length, fillContents); this.elementType = elementType; + this.knownElementKind = knownElementKind; } public ValueNode getElementType() { return elementType; } + public Kind getKnownElementKind() { + return knownElementKind; + } + protected NewArrayNode forConstantType(ResolvedJavaType type) { ValueNode len = length(); NewArrayNode ret = graph().add(NewArrayNode.create(type, len.isAlive() ? len : graph().addOrUniqueWithInputs(len), fillContents())); @@ -94,10 +105,10 @@ } @NodeIntrinsic - private static native Object newArray(Class<?> componentType, int length, @ConstantNodeParameter boolean fillContents); + private static native Object newArray(Class<?> componentType, int length, @ConstantNodeParameter boolean fillContents, @ConstantNodeParameter Kind knownElementKind); - public static Object newUninitializedArray(Class<?> componentType, int length) { - return newArray(componentType, length, false); + public static Object newUninitializedArray(Class<?> componentType, int length, Kind knownElementKind) { + return newArray(componentType, length, false, knownElementKind); } }