RFR 8242263: Diagnose synchronization on primitive wrappers

Doerr, Martin martin.doerr at sap.com
Tue Aug 4 11:19:46 UTC 2020


Hi Patricio,

thanks for taking care of PPC64, too.
Unfortunately, your version is not correct. "andi" instructions don't set CCR0.

I'd implement it as follows (including s390). Not yet tested.

Best regards,
Martin


diff -r 77852e129401 src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp
--- a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp     Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp     Tue Aug 04 13:10:51 2020 +0200
@@ -108,7 +108,7 @@
   if (DiagnoseSyncOnPrimitiveWrappers != 0) {
     load_klass(Rscratch, Roop);
     ld(Rscratch, in_bytes(Klass::access_flags_offset()), Rscratch);
-    andi(Rscratch, Rscratch, JVM_ACC_IS_BOX_CLASS);
+    testbitdi(CCR0, R0, Rscratch, exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
     bne(CCR0, slow_case);
   }

diff -r 77852e129401 src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp
--- a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp        Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp        Tue Aug 04 13:10:51 2020 +0200
@@ -913,7 +913,7 @@
     if (DiagnoseSyncOnPrimitiveWrappers != 0) {
       load_klass(tmp, object);
       ld(tmp, in_bytes(Klass::access_flags_offset()), tmp);
-      andi(tmp, tmp, JVM_ACC_IS_BOX_CLASS);
+      testbitdi(CCR0, R0, tmp, exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
       bne(CCR0, slow_case);
     }

diff -r 77852e129401 src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp        Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp        Tue Aug 04 13:10:51 2020 +0200
@@ -2839,7 +2839,7 @@
   if (DiagnoseSyncOnPrimitiveWrappers != 0) {
     load_klass(temp, oop);
     ld(temp, in_bytes(Klass::access_flags_offset()), temp);
-    andi(temp, temp, JVM_ACC_IS_BOX_CLASS);
+    testbitdi(CCR0, R0, temp, exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
     bne(CCR0, cont);
   }

diff -r 77852e129401 src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
--- a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp   Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp   Tue Aug 04 13:10:51 2020 +0200
@@ -91,6 +91,13 @@
   // Save object being locked into the BasicObjectLock...
   z_stg(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes()));

+  if (DiagnoseSyncOnPrimitiveWrappers != 0) {
+    load_klass(Z_R1_scratch, obj);
+    testbit(Address(Z_R1_scratch, in_bytes(Klass::access_flags_offset())),
+            exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
+    z_btrue(slow_case);
+  }
+
   if (UseBiasedLocking) {
     biased_locking_enter(obj, hdr, Z_R1_scratch, Z_R0_scratch, done, &slow_case);
   }
diff -r 77852e129401 src/hotspot/cpu/s390/interp_masm_s390.cpp
--- a/src/hotspot/cpu/s390/interp_masm_s390.cpp Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp Tue Aug 04 13:10:51 2020 +0200
@@ -1000,6 +1000,13 @@
   // Load markWord from object into displaced_header.
   z_lg(displaced_header, oopDesc::mark_offset_in_bytes(), object);

+  if (DiagnoseSyncOnPrimitiveWrappers != 0) {
+    load_klass(Z_R1_scratch, object);
+    testbit(Address(Z_R1_scratch, in_bytes(Klass::access_flags_offset())),
+            exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
+    z_btrue(slow_case);
+  }
+
   if (UseBiasedLocking) {
     biased_locking_enter(object, displaced_header, Z_R1, Z_R0, done, &slow_case);
   }
diff -r 77852e129401 src/hotspot/cpu/s390/macroAssembler_s390.cpp
--- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp      Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp      Tue Aug 04 13:10:51 2020 +0200
@@ -3358,6 +3358,13 @@
   // Load markWord from oop into mark.
   z_lg(displacedHeader, 0, oop);

+  if (DiagnoseSyncOnPrimitiveWrappers != 0) {
+    load_klass(Z_R1_scratch, oop);
+    testbit(Address(Z_R1_scratch, in_bytes(Klass::access_flags_offset())),
+            exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
+    z_btrue(done);
+  }
+
   if (try_bias) {
     biased_locking_enter(oop, displacedHeader, temp, Z_R0, done);
   }
d056149 at lu0482:/priv/d056149/jdk$ hg diff
diff -r 77852e129401 src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp
--- a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp     Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp     Tue Aug 04 13:17:06 2020 +0200
@@ -108,7 +108,7 @@
   if (DiagnoseSyncOnPrimitiveWrappers != 0) {
     load_klass(Rscratch, Roop);
     ld(Rscratch, in_bytes(Klass::access_flags_offset()), Rscratch);
-    andi(Rscratch, Rscratch, JVM_ACC_IS_BOX_CLASS);
+    testbitdi(CCR0, R0, Rscratch, exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
     bne(CCR0, slow_case);
   }

diff -r 77852e129401 src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp
--- a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp        Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp        Tue Aug 04 13:17:06 2020 +0200
@@ -913,7 +913,7 @@
     if (DiagnoseSyncOnPrimitiveWrappers != 0) {
       load_klass(tmp, object);
       ld(tmp, in_bytes(Klass::access_flags_offset()), tmp);
-      andi(tmp, tmp, JVM_ACC_IS_BOX_CLASS);
+      testbitdi(CCR0, R0, tmp, exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
       bne(CCR0, slow_case);
     }

diff -r 77852e129401 src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp        Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp        Tue Aug 04 13:17:06 2020 +0200
@@ -2839,7 +2839,7 @@
   if (DiagnoseSyncOnPrimitiveWrappers != 0) {
     load_klass(temp, oop);
     ld(temp, in_bytes(Klass::access_flags_offset()), temp);
-    andi(temp, temp, JVM_ACC_IS_BOX_CLASS);
+    testbitdi(CCR0, R0, temp, exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
     bne(CCR0, cont);
   }

diff -r 77852e129401 src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
--- a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp   Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp   Tue Aug 04 13:17:06 2020 +0200
@@ -91,6 +91,13 @@
   // Save object being locked into the BasicObjectLock...
   z_stg(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes()));

+  if (DiagnoseSyncOnPrimitiveWrappers != 0) {
+    load_klass(Z_R1_scratch, obj);
+    testbit(Address(Z_R1_scratch, in_bytes(Klass::access_flags_offset())),
+            exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
+    z_btrue(slow_case);
+  }
+
   if (UseBiasedLocking) {
     biased_locking_enter(obj, hdr, Z_R1_scratch, Z_R0_scratch, done, &slow_case);
   }
diff -r 77852e129401 src/hotspot/cpu/s390/interp_masm_s390.cpp
--- a/src/hotspot/cpu/s390/interp_masm_s390.cpp Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp Tue Aug 04 13:17:06 2020 +0200
@@ -1000,6 +1000,13 @@
   // Load markWord from object into displaced_header.
   z_lg(displaced_header, oopDesc::mark_offset_in_bytes(), object);

+  if (DiagnoseSyncOnPrimitiveWrappers != 0) {
+    load_klass(Z_R1_scratch, object);
+    testbit(Address(Z_R1_scratch, in_bytes(Klass::access_flags_offset())),
+            exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
+    z_btrue(slow_case);
+  }
+
   if (UseBiasedLocking) {
     biased_locking_enter(object, displaced_header, Z_R1, Z_R0, done, &slow_case);
   }
diff -r 77852e129401 src/hotspot/cpu/s390/macroAssembler_s390.cpp
--- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp      Tue Aug 04 10:03:57 2020 +0200
+++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp      Tue Aug 04 13:17:06 2020 +0200
@@ -3358,6 +3358,13 @@
   // Load markWord from oop into mark.
   z_lg(displacedHeader, 0, oop);

+  if (DiagnoseSyncOnPrimitiveWrappers != 0) {
+    load_klass(Z_R1_scratch, oop);
+    testbit(Address(Z_R1_scratch, in_bytes(Klass::access_flags_offset())),
+            exact_log2((intptr_t)JVM_ACC_IS_BOX_CLASS));
+    z_btrue(done);
+  }
+
   if (try_bias) {
     biased_locking_enter(oop, displacedHeader, temp, Z_R0, done);
   }



More information about the hotspot-runtime-dev mailing list