Mercurial > hg > truffle
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) {