changeset 18600:f6ca61099649

arraycopy: don't use checkcast stub if the arrays overlap
author Bernhard Urban <bernhard.urban@jku.at>
date Wed, 03 Dec 2014 14:50:16 +0100
parents 68cab2726edb
children 676f1800077c
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java	Wed Dec 03 14:31:15 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java	Wed Dec 03 14:50:16 2014 +0100
@@ -190,8 +190,12 @@
         Object nonNullSrc = guardingNonNull(src);
         Object nonNullDest = guardingNonNull(dest);
         checkLimits(nonNullSrc, srcPos, nonNullDest, destPos, length);
-        KlassPointer destElemKlass = loadHub(nonNullDest);
-        checkcastArraycopyHelper(srcPos, destPos, length, nonNullSrc, nonNullDest, destElemKlass);
+        if (probability(SLOW_PATH_PROBABILITY, nonNullSrc == nonNullDest)) {
+            System.arraycopy(nonNullSrc, srcPos, nonNullDest, destPos, length);
+        } else {
+            KlassPointer destElemKlass = loadHub(nonNullDest);
+            checkcastArraycopyHelper(srcPos, destPos, length, nonNullSrc, nonNullDest, destElemKlass);
+        }
     }
 
     private static void checkcastArraycopyHelper(int srcPos, int destPos, int length, Object nonNullSrc, Object nonNullDest, KlassPointer destElemKlass) {