# HG changeset patch # User Lukas Stadler # Date 1370854360 -7200 # Node ID b1b69cb27756ac262cc78b4463e7ae79a9ad6156 # Parent 38b1517cf458472320a3dfdbf4887ecbaf17fafe# Parent 1b33ef6544b436973a2471f6c4f5f541b14fcb09 Merge (1b33ef6544b4 Fixed a warning) diff -r 1b33ef6544b4 -r b1b69cb27756 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 09:30:32 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Mon Jun 10 10:52:40 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++) {