# HG changeset patch # User Lukas Stadler # Date 1370854164 -7200 # Node ID 8efb5a58a799096e0a049cf7778d082b3d23155a # Parent b4325bc087c4c80b111e649839d6ec85949c90f2 more checks for ArrayCopyNode virtualization diff -r b4325bc087c4 -r 8efb5a58a799 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 Sat Jun 08 15:44:39 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Mon Jun 10 10:49:24 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++) {