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 {