--- old/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp 2018-03-07 09:14:33.334983767 +0100 +++ new/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp 2018-03-07 09:14:33.174976887 +0100 @@ -2991,7 +2991,7 @@ } void LIR_Assembler::load_barrier_test(LIR_Opr ref) { - __ testptr(ref->as_register(), ExternalAddress((address)&ZAddressBadMask)); + __ testptr(ref->as_register(), Address(r15_thread, JavaThread::zaddress_bad_mask_offset())); } void LIR_Assembler::store_parameter(Register r, int offset_from_rsp_in_words) { --- old/src/hotspot/cpu/x86/macroAssembler_x86.cpp 2018-03-07 09:14:33.629996452 +0100 +++ new/src/hotspot/cpu/x86/macroAssembler_x86.cpp 2018-03-07 09:14:33.467989486 +0100 @@ -6621,7 +6621,7 @@ movptr(ref, Address(resolved_ref_addr, 0)); // Check if mask is not bad, which includes an implicit null check. - testptr(ref, ExternalAddress((address)&ZAddressBadMask)); + testptr(ref, Address(r15_thread, JavaThread::zaddress_bad_mask_offset())); jcc(Assembler::zero, done); // Save live registers @@ -6751,7 +6751,7 @@ if (VerifyOops && UseLoadBarrier) { // Check if mask is good Label done; - testptr(src, as_Address(ExternalAddress((address)&ZAddressBadMask))); + testptr(src, Address(r15_thread, JavaThread::zaddress_bad_mask_offset())); jcc(Assembler::zero, done); STOP("Writing broken oop"); should_not_reach_here(); --- old/src/hotspot/cpu/x86/macroAssembler_x86.hpp 2018-03-07 09:14:33.987011802 +0100 +++ new/src/hotspot/cpu/x86/macroAssembler_x86.hpp 2018-03-07 09:14:33.827004923 +0100 @@ -860,7 +860,6 @@ void testptr(Register src, int32_t imm32) { LP64_ONLY(testq(src, imm32)) NOT_LP64(testl(src, imm32)); } void testptr(Register src1, Address src2) { LP64_ONLY(testq(src1, src2)) NOT_LP64(testl(src1, src2)); } - void testptr(Register src1, AddressLiteral src2) { testptr(src1, as_Address(src2)); } void testptr(Register src1, Register src2); void xorptr(Register dst, Register src) { LP64_ONLY(xorq(dst, src)) NOT_LP64(xorl(dst, src)); } --- old/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp 2018-03-07 09:14:34.249023068 +0100 +++ new/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp 2018-03-07 09:14:34.090016231 +0100 @@ -1114,7 +1114,7 @@ if (UseLoadBarrier) { // Check if metadata bits indicate a bad oop - __ testptr(rax, ExternalAddress((address)&ZAddressBadMask)); + __ testptr(rax, Address(r15_thread, JavaThread::zaddress_bad_mask_offset())); __ jcc(Assembler::notZero, error); } --- old/src/hotspot/share/compiler/compilerDirectives.hpp 2018-03-07 09:14:34.571036914 +0100 +++ new/src/hotspot/share/compiler/compilerDirectives.hpp 2018-03-07 09:14:34.391029174 +0100 @@ -72,7 +72,6 @@ cflags(OptimizeLoadBarriers, bool, OptimizeLoadBarriers, OptimizeLoadBarriers) \ cflags(UseBasicLoadBarrier, bool, UseBasicLoadBarrier, UseBasicLoadBarrier) \ /* ZGC temporary flags */ \ - cflags(UseR15TestInLoadBarrier, bool, UseR15TestInLoadBarrier, UseR15TestInLoadBarrier) \ cflags(UseCASLoadBarrier, bool, UseCASLoadBarrier, UseCASLoadBarrier) \ cflags(UseWeakCASLoadBarrier, bool, UseWeakCASLoadBarrier, UseWeakCASLoadBarrier) \ cflags(UseCMPXLoadBarrier, bool, UseCMPXLoadBarrier, UseCMPXLoadBarrier) \ --- old/src/hotspot/share/opto/c2_globals.hpp 2018-03-07 09:14:34.813047320 +0100 +++ new/src/hotspot/share/opto/c2_globals.hpp 2018-03-07 09:14:34.650040311 +0100 @@ -759,10 +759,6 @@ product_pd(bool, UseBasicLoadBarrier, \ "Force the original simple barrier variant") \ \ - /* ZGC temporary flags, remove later */ \ - product(bool, UseR15TestInLoadBarrier, true, \ - "Use R15 + offset for Loadbarrier test") \ - \ product(bool, UseCASLoadBarrier, true, \ "Turn of CAS barrier only, debug tool") \ \ --- old/src/hotspot/share/opto/macro.cpp 2018-03-07 09:14:35.082058887 +0100 +++ new/src/hotspot/share/opto/macro.cpp 2018-03-07 09:14:34.908051405 +0100 @@ -2709,21 +2709,13 @@ float likely = PROB_LIKELY(0.999); const Type* in_val_maybe_null_t = _igvn.type(in_val); - Node* bad_mask = NULL; - Node* good_mask = NULL; #ifdef SPARC - bad_mask = _igvn.transform(new AddrBadBitNode()); + Node* bad_mask = _igvn.transform(new AddrBadBitNode()); #else - if (C->directive()->UseR15TestInLoadBarrierOption) { - Node* jthread = _igvn.transform(new ThreadLocalNode()); - Node* adr = basic_plus_adr(jthread, in_bytes(JavaThread::zaddress_bad_mask_offset())); - bad_mask = _igvn.transform(LoadNode::make(_igvn, in_ctrl, in_mem, adr, TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered)); - } else { - bad_mask = _igvn.transform(LoadNode::make(_igvn, in_ctrl, in_mem, makecon(TypeRawPtr::make((address)addr_bad_bit)), - TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered)); - } + Node* jthread = _igvn.transform(new ThreadLocalNode()); + Node* adr = basic_plus_adr(jthread, in_bytes(JavaThread::zaddress_bad_mask_offset())); + Node* bad_mask = _igvn.transform(LoadNode::make(_igvn, in_ctrl, in_mem, adr, TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered)); #endif - Node* cast = _igvn.transform(new CastP2XNode(in_ctrl, in_val)); Node* obj_masked = _igvn.transform(new AndXNode(cast, bad_mask)); Node* cmp = _igvn.transform(new CmpXNode(obj_masked, _igvn.zerocon(TypeX_X->basic_type()))); @@ -2820,16 +2812,9 @@ float likely = PROB_LIKELY(0.999); const Type* in_val_not_null_t = _igvn.type(in_val); - Node* bad_mask = NULL; - if (C->directive()->UseR15TestInLoadBarrierOption) { - Node* jthread = _igvn.transform(new ThreadLocalNode()); - Node* adr = basic_plus_adr(jthread, in_bytes(JavaThread::zaddress_bad_mask_offset())); - bad_mask = _igvn.transform(LoadNode::make(_igvn, in_ctrl, in_mem, adr, TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered)); - } else { - bad_mask = _igvn.transform(LoadNode::make(_igvn, in_ctrl, in_mem, makecon(TypeRawPtr::make((address)addr_bad_bit)), - TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered)); - } - + Node* jthread = _igvn.transform(new ThreadLocalNode()); + Node* adr = basic_plus_adr(jthread, in_bytes(JavaThread::zaddress_bad_mask_offset())); + Node* bad_mask = _igvn.transform(LoadNode::make(_igvn, in_ctrl, in_mem, adr, TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered)); Node* cast = _igvn.transform(new CastP2XNode(in_ctrl, in_val)); Node* obj_masked = _igvn.transform(new AndXNode(cast, bad_mask)); Node* cmp = _igvn.transform(new CmpXNode(obj_masked, _igvn.zerocon(TypeX_X->basic_type()))); --- old/test/hotspot/gtest/gc/z/test_zAddress.cpp 2018-03-07 09:14:35.359070798 +0100 +++ new/test/hotspot/gtest/gc/z/test_zAddress.cpp 2018-03-07 09:14:35.199063918 +0100 @@ -6,24 +6,10 @@ #include "precompiled.hpp" #include "gc/z/zAddress.inline.hpp" #include "gc/z/zGlobals.hpp" -#include "runtime/globals_extension.hpp" #include "unittest.hpp" class ZAddressTest : public ::testing::Test { -private: - bool _old_UseR15TestInLoadBarrier; - protected: - virtual void SetUp() { - // Have to bypass the code in set_good_mask. - _old_UseR15TestInLoadBarrier = UseR15TestInLoadBarrier; - UseR15TestInLoadBarrier = false; - } - - virtual void TearDown() { - UseR15TestInLoadBarrier = _old_UseR15TestInLoadBarrier; - } - static void is_good_bit(uintptr_t bit_mask) { // Setup uintptr_t mask_before = ZAddressGoodMask;