Mercurial > hg > graal-jvmci-8
changeset 9958:8efb5a58a799
more checks for ArrayCopyNode virtualization
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Mon, 10 Jun 2013 10:49:24 +0200 |
parents | b4325bc087c4 |
children | 38b1517cf458 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java |
diffstat | 1 files changed, 21 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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++) {