Mercurial > hg > graal-jvmci-8
changeset 4425:f75f0cdf0ccc
Fix missing write barrier for object arraycopy's aliased case
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 01 Feb 2012 17:46:20 +0100 |
parents | fe11e8522eb3 |
children | 002673e4c67f 539fca6a3b98 |
files | graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/snippets/ArrayCopySnippets.java |
diffstat | 1 files changed, 12 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/snippets/ArrayCopySnippets.java Wed Feb 01 17:23:23 2012 +0100 +++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/snippets/ArrayCopySnippets.java Wed Feb 01 17:46:20 2012 +0100 @@ -225,6 +225,18 @@ } else { copyObjectsUp(src, srcPos * 8L, dest, destPos * 8L, length); } + if (length > 0) { + long header = ArrayHeaderSizeNode.sizeFor(CiKind.Object); + int cardShift = CardTableShiftNode.get(); + long cardStart = CardTableStartNode.get(); + long dstAddr = GetObjectAddressNode.get(dest); + long start = (dstAddr + header + destPos * 8L) >>> cardShift; + long end = (dstAddr + header + (destPos + length - 1) * 8L) >>> cardShift; + long count = end - start; + while (count-- >= 0) { + DirectStoreNode.store((start + cardStart) + count, false); + } + } } @Snippet @@ -333,18 +345,6 @@ Object a = UnsafeLoadNode.load(src, i + (srcOffset + header), CiKind.Object); UnsafeStoreNode.store(dest, i + (destOffset + header), a, CiKind.Object); } - if (length > 0) { - int cardShift = CardTableShiftNode.get(); - long cardStart = CardTableStartNode.get(); - long dstAddr = GetObjectAddressNode.get(dest); - long start = (dstAddr + header + destOffset) >>> cardShift; - long end = (dstAddr + header + destOffset + 8L * (length - 1)) >>> cardShift; - long count = end - start; - while (count-- >= 0) { - DirectStoreNode.store((start + cardStart) + count, false); - } - } - } private static class GetObjectAddressNode extends FixedWithNextNode implements LIRLowerable {