# HG changeset patch # User Tom Rodriguez # Date 1418677844 28800 # Node ID 8923610115c9d92ebb1a06465785366443a03606 # Parent 0eba324e27dbf4f509238b8b1e36952608a63586 Capture worst case element type for Array.newInstance if known diff -r 0eba324e27db -r 8923610115c9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java --- 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; } diff -r 0eba324e27db -r 8923610115c9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java --- 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); } }