Only C2 optimizes "release stores"?

Martin Buchholz martinrb at google.com
Mon Dec 1 22:31:04 UTC 2014


Hi fence team,

I'm foolishly reading hotspot sources and see

// The non-intrinsified versions of setOrdered just use setVolatile

But why?

Aside from conservative fear (never ever weaken fences!) why not do the obvious

diff --git a/src/share/vm/prims/unsafe.cpp b/src/share/vm/prims/unsafe.cpp
--- a/src/share/vm/prims/unsafe.cpp
+++ b/src/share/vm/prims/unsafe.cpp
@@ -171,8 +171,12 @@
 #define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
   oop p = JNIHandles::resolve(obj); \
   OrderAccess::release_store_fence((volatile
type_name*)index_oop_from_field_offset_long(p, offset), x);

+#define SET_FIELD_RELEASE(obj, offset, type_name, x) \
+  oop p = JNIHandles::resolve(obj); \
+  OrderAccess::release_store((volatile
type_name*)index_oop_from_field_offset_long(p, offset), x);
+
 // Macros for oops that check UseCompressedOops

 #define GET_OOP_FIELD(obj, offset, v) \
   oop p = JNIHandles::resolve(obj);   \
@@ -372,9 +376,9 @@
 // The non-intrinsified versions of setOrdered just use setVolatile

 UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe,
jobject obj, jlong offset, jint x))
   UnsafeWrapper("Unsafe_SetOrderedInt");
-  SET_FIELD_VOLATILE(obj, offset, jint, x);
+  SET_FIELD_RELEASE(obj, offset, jint, x);
 UNSAFE_END

 UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject
unsafe, jobject obj, jlong offset, jobject x_h))
   UnsafeWrapper("Unsafe_SetOrderedObject");
@@ -386,15 +390,14 @@
     oop_store((narrowOop*)addr, x);
   } else {
     oop_store((oop*)addr, x);
   }
-  OrderAccess::fence();
 UNSAFE_END

 UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe,
jobject obj, jlong offset, jlong x))
   UnsafeWrapper("Unsafe_SetOrderedLong");
 #ifdef SUPPORTS_NATIVE_CX8
-  SET_FIELD_VOLATILE(obj, offset, jlong, x);
+  SET_FIELD_RELEASE(obj, offset, jlong, x);
 #else
   // Keep old code for platforms which may not have atomic long (8
bytes) instructions
   {
     if (VM_Version::supports_cx8()) {


More information about the hotspot-runtime-dev mailing list