Mercurial > hg > graal-compiler
changeset 23201:2e195fa3808c
do not check entry type while virtualizing System.arraycopy if destination array is Object[]
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Thu, 17 Dec 2015 17:20:10 +0100 |
parents | d1a5115ea68d |
children | b774f4158a1a |
files | graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicArrayCopyNode.java |
diffstat | 2 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java Thu Dec 17 11:45:03 2015 +0000 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java Thu Dec 17 17:20:10 2015 +0100 @@ -130,6 +130,20 @@ } @Test + public void testArrayCopy() { + testPartialEscapeAnalysis("testArrayCopySnippet", 0, 0); + } + + public static Object[] array = new Object[]{1, 2, 3, 4, 5, "asdf", "asdf"}; + + public static Object testArrayCopySnippet(int a) { + Object[] tmp = new Object[]{a != 1 ? array[a] : null}; + Object[] tmp2 = new Object[5]; + System.arraycopy(tmp, 0, tmp2, 4, 1); + return tmp2[4]; + } + + @Test @Ignore public void testCache() { testPartialEscapeAnalysis("testCacheSnippet", 0.75, 1);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicArrayCopyNode.java Thu Dec 17 11:45:03 2015 +0000 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicArrayCopyNode.java Thu Dec 17 17:20:10 2015 +0100 @@ -146,7 +146,7 @@ } private static boolean checkEntryTypes(int srcPos, int length, VirtualObjectNode src, ResolvedJavaType destComponentType, VirtualizerTool tool) { - if (destComponentType.getJavaKind() == JavaKind.Object) { + if (destComponentType.getJavaKind() == JavaKind.Object && !tool.getMetaAccessProvider().lookupJavaType(Object.class).equals(destComponentType)) { for (int i = 0; i < length; i++) { ValueNode entry = tool.getEntry(src, srcPos + i); ResolvedJavaType type = StampTool.typeOrNull(entry);