6968348: Byteswapped memory access can point to wrong location after JIT
Reviewed-by: twisti, kvn, iveresov
--- 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));
+ }
+ }
+}