# HG changeset patch # User Christian Haeubl # Date 1370859762 -7200 # Node ID e2ffbaa682b84d2eba5ceafa6374317931fc3ca5 # Parent a76b46d8b231152b2550c4cc550b8fa1c9771783# Parent b1b69cb27756ac262cc78b4463e7ae79a9ad6156 Merge. diff -r a76b46d8b231 -r e2ffbaa682b8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Mon Jun 10 12:21:58 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Mon Jun 10 12:22:42 2013 +0200 @@ -116,10 +116,22 @@ return position >= 0 && position + length <= virtualObject.entryCount(); } - private static boolean checkEntryTypes(int srcPos, int length, State srcState, ResolvedJavaType destComponentType) { + private static boolean checkEntryTypes(int srcPos, int length, State srcState, ResolvedJavaType destComponentType, VirtualizerTool tool) { if (destComponentType.getKind() == Kind.Object) { for (int i = 0; i < length; i++) { - if (!destComponentType.isAssignableFrom(srcState.getEntry(srcPos + i).objectStamp().type())) { + ValueNode entry = srcState.getEntry(srcPos + i); + State state = tool.getObjectState(entry); + ResolvedJavaType type; + if (state != null) { + if (state.getState() == EscapeState.Virtual) { + type = state.getVirtualObject().type(); + } else { + type = state.getMaterializedValue().objectStamp().type(); + } + } else { + type = entry.objectStamp().type(); + } + if (type == null || !destComponentType.isAssignableFrom(type)) { return false; } } @@ -139,10 +151,16 @@ if (srcState != null && srcState.getState() == EscapeState.Virtual && destState != null && destState.getState() == EscapeState.Virtual) { VirtualObjectNode srcVirtual = srcState.getVirtualObject(); VirtualObjectNode destVirtual = destState.getVirtualObject(); + if (!(srcVirtual instanceof VirtualArrayNode) || !(destVirtual instanceof VirtualArrayNode)) { + return; + } + if (((VirtualArrayNode) srcVirtual).componentType().getKind() != Kind.Object || ((VirtualArrayNode) destVirtual).componentType().getKind() != Kind.Object) { + return; + } if (length < 0 || !checkBounds(srcPos, length, srcVirtual) || !checkBounds(destPos, length, destVirtual)) { return; } - if (!checkEntryTypes(srcPos, length, srcState, destVirtual.type().getComponentType())) { + if (!checkEntryTypes(srcPos, length, srcState, destVirtual.type().getComponentType(), tool)) { return; } for (int i = 0; i < length; i++) {