6968348: Byteswapped memory access can point to wrong location after JIT
authornever
Mon, 04 Oct 2010 17:09:18 -0700
changeset 6753 74ad1f54eab7
parent 6752 9a3b09fd5745
child 6754 ab3f0dd8fe9f
6968348: Byteswapped memory access can point to wrong location after JIT Reviewed-by: twisti, kvn, iveresov
hotspot/src/cpu/x86/vm/x86_64.ad
hotspot/test/compiler/6968348/Test6968348.java
--- a/hotspot/src/cpu/x86/vm/x86_64.ad	Thu Sep 30 18:31:45 2010 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad	Mon Oct 04 17:09:18 2010 -0700
@@ -7349,43 +7349,6 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct loadI_reversed(rRegI dst, memory src) %{
-  match(Set dst (ReverseBytesI (LoadI src)));
-
-  format %{ "bswap_movl $dst, $src" %}
-  opcode(0x8B, 0x0F, 0xC8); /* Opcode 8B 0F C8 */
-  ins_encode(REX_reg_mem(dst, src), OpcP, reg_mem(dst, src), REX_reg(dst), OpcS, opc3_reg(dst));
-  ins_pipe( ialu_reg_mem );
-%}
-
-instruct loadL_reversed(rRegL dst, memory src) %{
-  match(Set dst (ReverseBytesL (LoadL src)));
-
-  format %{ "bswap_movq $dst, $src" %}
-  opcode(0x8B, 0x0F, 0xC8); /* Opcode 8B 0F C8 */
-  ins_encode(REX_reg_mem_wide(dst, src), OpcP, reg_mem(dst, src), REX_reg_wide(dst), OpcS, opc3_reg(dst));
-  ins_pipe( ialu_reg_mem );
-%}
-
-instruct storeI_reversed(memory dst, rRegI src) %{
-  match(Set dst (StoreI dst (ReverseBytesI  src)));
-
-  format %{ "movl_bswap $dst, $src" %}
-  opcode(0x0F, 0xC8, 0x89); /* Opcode 0F C8 89 */
-  ins_encode( REX_reg(src), OpcP, opc2_reg(src), REX_reg_mem(src, dst), OpcT, reg_mem(src, dst) );
-  ins_pipe( ialu_mem_reg );
-%}
-
-instruct storeL_reversed(memory dst, rRegL src) %{
-  match(Set dst (StoreL dst (ReverseBytesL  src)));
-
-  format %{ "movq_bswap $dst, $src" %}
-  opcode(0x0F, 0xC8, 0x89); /* Opcode 0F C8 89 */
-  ins_encode( REX_reg_wide(src), OpcP, opc2_reg(src), REX_reg_mem_wide(src, dst), OpcT, reg_mem(src, dst) );
-  ins_pipe( ialu_mem_reg );
-%}
-
-
 //---------- Zeros Count Instructions ------------------------------------------
 
 instruct countLeadingZerosI(rRegI dst, rRegI src, rFlagsReg cr) %{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6968348/Test6968348.java	Mon Oct 04 17:09:18 2010 -0700
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 6968348
+ * @summary Byteswapped memory access can point to wrong location after JIT
+ *
+ * @run main Test6968348
+ */
+
+import sun.misc.Unsafe;
+import java.lang.reflect.*;
+
+public class Test6968348 {
+    static Unsafe unsafe;
+    static final long[] buffer = new long[4096];
+    static int array_long_base_offset;
+
+    public static void main(String[] args) throws Exception {
+        Class c = Test6968348.class.getClassLoader().loadClass("sun.misc.Unsafe");
+        Field f = c.getDeclaredField("theUnsafe");
+        f.setAccessible(true);
+        unsafe = (Unsafe)f.get(c);
+        array_long_base_offset = unsafe.arrayBaseOffset(long[].class);
+
+        for (int n = 0; n < 100000; n++) {
+            test();
+        }
+    }
+
+    public static void test() {
+        for (long i = array_long_base_offset; i < 4096; i += 8) {
+            unsafe.putLong(buffer, i, Long.reverseBytes(i));
+        }
+    }
+}