diff -r 42d198677884 -r 2fdf635bcf28 src/share/vm/opto/library_call.cpp --- a/src/share/vm/opto/library_call.cpp Thu Sep 05 18:40:52 2019 +0800 +++ b/src/share/vm/opto/library_call.cpp Thu Sep 05 18:52:27 2019 +0800 @@ -2608,9 +2608,10 @@ Node* offset = top(); Node* val; + // The base is either a Java object or a value produced by Unsafe.staticFieldBase + Node* base = argument(1); // type: oop + if (!is_native_ptr) { - // The base is either a Java object or a value produced by Unsafe.staticFieldBase - Node* base = argument(1); // type: oop // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset offset = argument(2); // type: long // We currently rely on the cookies produced by Unsafe.xxxFieldOffset @@ -2630,9 +2631,7 @@ val = is_store ? argument(3) : NULL; } - // Can base be NULL? Otherwise, always on-heap access. - bool can_access_non_heap = TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop)); - if (can_access_non_heap && type == T_OBJECT) { + if ((_gvn.type(base)->isa_ptr() == TypePtr::NULL_PTR) && type == T_OBJECT) { return false; // off-heap oop accesses are not supported }