changeset 21254:7a49a2763a7a

UnsafeEATest: use 8 byte aligned x field
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Wed, 06 May 2015 17:10:58 +0200
parents cf5f6a69d013
children ccddbb1409d2
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EATestBase.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/UnsafeEATest.java
diffstat 2 files changed, 32 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EATestBase.java	Wed May 06 17:05:14 2015 +0200
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EATestBase.java	Wed May 06 17:10:58 2015 +0200
@@ -51,6 +51,7 @@
     public static class TestClassInt {
         public int x;
         public int y;
+        public int z;
 
         public TestClassInt() {
             this(0, 0);
@@ -68,7 +69,7 @@
         @Override
         public boolean equals(Object obj) {
             TestClassInt other = (TestClassInt) obj;
-            return x == other.x && y == other.y;
+            return x == other.x && y == other.y && z == other.z;
         }
 
         @Override
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/UnsafeEATest.java	Wed May 06 17:05:14 2015 +0200
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/UnsafeEATest.java	Wed May 06 17:10:58 2015 +0200
@@ -36,15 +36,23 @@
     public static int zero = 0;
 
     private static final Unsafe unsafe;
-    private static final long fieldOffsetX;
-    private static final long fieldOffsetY;
+    private static final long fieldOffset1;
+    private static final long fieldOffset2;
 
     static {
         unsafe = UnsafeAccess.unsafe;
         try {
-            fieldOffsetX = unsafe.objectFieldOffset(TestClassInt.class.getField("x"));
-            fieldOffsetY = unsafe.objectFieldOffset(TestClassInt.class.getField("y"));
-            assert fieldOffsetY == fieldOffsetX + 4;
+            long localFieldOffset1 = unsafe.objectFieldOffset(TestClassInt.class.getField("x"));
+            // Make the fields 8 byte aligned (Required for testing setLong on Architectures which
+            // does not support unaligned memory access
+            if (localFieldOffset1 % 8 == 0) {
+                fieldOffset1 = localFieldOffset1;
+                fieldOffset2 = unsafe.objectFieldOffset(TestClassInt.class.getField("y"));
+            } else {
+                fieldOffset1 = unsafe.objectFieldOffset(TestClassInt.class.getField("y"));
+                fieldOffset2 = unsafe.objectFieldOffset(TestClassInt.class.getField("z"));
+            }
+            assert fieldOffset2 == fieldOffset1 + 4;
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -57,8 +65,8 @@
 
     public static int testSimpleIntSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putInt(x, fieldOffsetX, 101);
-        return unsafe.getInt(x, fieldOffsetX);
+        unsafe.putInt(x, fieldOffset1, 101);
+        return unsafe.getInt(x, fieldOffset1);
     }
 
     @Test
@@ -68,7 +76,7 @@
 
     public static TestClassInt testMaterializedIntSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putInt(x, fieldOffsetX, 101);
+        unsafe.putInt(x, fieldOffset1, 101);
         return x;
     }
 
@@ -79,8 +87,8 @@
 
     public static double testSimpleDoubleSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putDouble(x, fieldOffsetX, 10.1);
-        return unsafe.getDouble(x, fieldOffsetX);
+        unsafe.putDouble(x, fieldOffset1, 10.1);
+        return unsafe.getDouble(x, fieldOffset1);
     }
 
     @Test
@@ -97,12 +105,12 @@
         TestClassInt x;
         if (a) {
             x = new TestClassInt(0, 0);
-            unsafe.putDouble(x, fieldOffsetX, doubleField);
+            unsafe.putDouble(x, fieldOffset1, doubleField);
         } else {
             x = new TestClassInt();
-            unsafe.putDouble(x, fieldOffsetX, doubleField2);
+            unsafe.putDouble(x, fieldOffset1, doubleField2);
         }
-        return unsafe.getDouble(x, fieldOffsetX);
+        return unsafe.getDouble(x, fieldOffset1);
     }
 
     @Test
@@ -112,7 +120,7 @@
 
     public static TestClassInt testMaterializedDoubleSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putDouble(x, fieldOffsetX, 10.1);
+        unsafe.putDouble(x, fieldOffset1, 10.1);
         return x;
     }
 
@@ -126,10 +134,10 @@
 
     public static TestClassInt testDeoptDoubleVarSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putDouble(x, fieldOffsetX, doubleField);
+        unsafe.putDouble(x, fieldOffset1, doubleField);
         doubleField2 = 123;
         try {
-            doubleField = ((int) unsafe.getDouble(x, fieldOffsetX)) / zero;
+            doubleField = ((int) unsafe.getDouble(x, fieldOffset1)) / zero;
         } catch (RuntimeException e) {
             return x;
         }
@@ -143,10 +151,10 @@
 
     public static TestClassInt testDeoptDoubleConstantSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putDouble(x, fieldOffsetX, 10.123);
+        unsafe.putDouble(x, fieldOffset1, 10.123);
         doubleField2 = 123;
         try {
-            doubleField = ((int) unsafe.getDouble(x, fieldOffsetX)) / zero;
+            doubleField = ((int) unsafe.getDouble(x, fieldOffset1)) / zero;
         } catch (RuntimeException e) {
             return x;
         }
@@ -163,10 +171,10 @@
 
     public static TestClassInt testDeoptLongVarSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putLong(x, fieldOffsetX, longField);
+        unsafe.putLong(x, fieldOffset1, longField);
         longField2 = 123;
         try {
-            longField = unsafe.getLong(x, fieldOffsetX) / zero;
+            longField = unsafe.getLong(x, fieldOffset1) / zero;
         } catch (RuntimeException e) {
             return x;
         }
@@ -180,10 +188,10 @@
 
     public static TestClassInt testDeoptLongConstantSnippet() {
         TestClassInt x = new TestClassInt();
-        unsafe.putLong(x, fieldOffsetX, 0x2222222210123L);
+        unsafe.putLong(x, fieldOffset1, 0x2222222210123L);
         longField2 = 123;
         try {
-            longField = unsafe.getLong(x, fieldOffsetX) / zero;
+            longField = unsafe.getLong(x, fieldOffset1) / zero;
         } catch (RuntimeException e) {
             return x;
         }