# HG changeset patch # User Gilles Duboscq # Date 1328114780 -3600 # Node ID f75f0cdf0cccf50226a6f87399d6dfcfa4a247c7 # Parent fe11e8522eb3ae20fa36325bb0529a3dd193d646 Fix missing write barrier for object arraycopy's aliased case diff -r fe11e8522eb3 -r f75f0cdf0ccc graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/snippets/ArrayCopySnippets.java --- 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 {