# HG changeset patch # User Roman Kennke # Date 1421931097 -3600 # Node ID 0086e1d4fe0c5301fbd0e7912aa04a42fb2e14de # Parent 17700eb91e420670b9e7ace30affe884c565aef2 Remove interpreter-type barriers from C1 code. Get rid of write-barrier in unlock in C1. diff -r 17700eb91e42 -r 0086e1d4fe0c src/cpu/x86/vm/c1_LIRGenerator_x86.cpp --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu Jan 22 13:51:37 2015 +0100 @@ -370,7 +370,9 @@ // this CodeEmitInfo must not have the xhandlers because here the // object is already locked (xhandlers expect object to be unlocked) CodeEmitInfo* info = state_for(x, x->state(), true); - monitor_enter(obj.result(), lock, syncTempOpr(), scratch, + LIR_Opr obj_opr = obj.result(); + obj_opr = shenandoah_write_barrier(obj_opr, state_for(x/*, x->state_before()*/), x->needs_null_check()); + monitor_enter(obj_opr, lock, syncTempOpr(), scratch, x->monitor_no(), info_for_exception, info); } diff -r 17700eb91e42 -r 0086e1d4fe0c src/cpu/x86/vm/c1_MacroAssembler_x86.cpp --- a/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp Thu Jan 22 13:51:37 2015 +0100 @@ -35,6 +35,35 @@ #include "runtime/os.hpp" #include "runtime/stubRoutines.hpp" +#ifdef ASSERT +#include "gc_implementation/shenandoah/shenandoahHeap.hpp" +#include "gc_implementation/shenandoah/shenandoahHeapRegion.hpp" + +void C1_MacroAssembler::check_obj_shenandoah(Register obj, const char* err_msg) { + if (UseShenandoahGC) { + Label done; + push(rscratch1); + push(rscratch2); + + testptr(obj, obj); + jcc(Assembler::zero, done); + + movptr(rscratch1, obj); + shrq(rscratch1, ShenandoahHeapRegion::RegionSizeShift); + movptr(rscratch2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr()); + cmpb(Address(rscratch2, rscratch1, Address::times_1), 0); + jcc(Assembler::equal, done); + + stop(err_msg); + + bind(done); + + pop(rscratch2); + pop(rscratch1); + } +} +#endif + int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register scratch, Label& slow_case) { const int aligned_mask = BytesPerWord -1; const int hdr_offset = oopDesc::mark_offset_in_bytes(); @@ -43,7 +72,10 @@ Label done; int null_check_offset = -1; - oopDesc::bs()->compile_resolve_oop_for_write(this, obj, true, 0, 1, BarrierSet::ss_all); +#ifdef ASSERT + check_obj_shenandoah(obj, "attempted lock of from-space object"); +#endif + verify_oop(obj); // save object being locked into the BasicObjectLock @@ -109,7 +141,11 @@ if (UseBiasedLocking) { // load object movptr(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes())); - oopDesc::bs()->compile_resolve_oop_for_write(this, obj, false, 0, 1, BarrierSet::ss_all); + +#ifdef ASSERT + check_obj_shenandoah(obj, "attempted biased unlock of from-space object"); +#endif + biased_locking_exit(obj, hdr, done); } @@ -122,7 +158,9 @@ if (!UseBiasedLocking) { // load object movptr(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes())); - oopDesc::bs()->compile_resolve_oop_for_write(this, obj, false, 0, 1, BarrierSet::ss_all); +#ifdef ASSERT + check_obj_shenandoah(obj, "attempted unlock of from-space object"); +#endif } verify_oop(obj); // test if object header is pointing to the displaced header, and if so, restore diff -r 17700eb91e42 -r 0086e1d4fe0c src/cpu/x86/vm/c1_MacroAssembler_x86.hpp --- a/src/cpu/x86/vm/c1_MacroAssembler_x86.hpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/cpu/x86/vm/c1_MacroAssembler_x86.hpp Thu Jan 22 13:51:37 2015 +0100 @@ -117,4 +117,8 @@ void invalidate_registers(bool inv_rax, bool inv_rbx, bool inv_rcx, bool inv_rdx, bool inv_rsi, bool inv_rdi) PRODUCT_RETURN; +#ifdef ASSERT +void check_obj_shenandoah(Register obj, const char* err_msg); +#endif + #endif // CPU_X86_VM_C1_MACROASSEMBLER_X86_HPP diff -r 17700eb91e42 -r 0086e1d4fe0c src/share/vm/c1/c1_LIRGenerator.cpp --- a/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Thu Jan 22 13:51:37 2015 +0100 @@ -2876,6 +2876,7 @@ __ load_stack_address_monitor(0, lock); CodeEmitInfo* info = new CodeEmitInfo(scope()->start()->state()->copy(ValueStack::StateBefore, SynchronizationEntryBCI), NULL, x->check_flag(Instruction::DeoptimizeOnException)); + obj = shenandoah_write_barrier(obj, info, false); CodeStub* slow_path = new MonitorEnterStub(obj, lock, info); // receiver is guaranteed non-NULL so don't need CodeEmitInfo diff -r 17700eb91e42 -r 0086e1d4fe0c src/share/vm/compiler/oopMap.cpp --- a/src/share/vm/compiler/oopMap.cpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/share/vm/compiler/oopMap.cpp Thu Jan 22 13:51:37 2015 +0100 @@ -305,6 +305,9 @@ assert( i < len, "oopmap not found" ); OopMap* m = at(i); + if (m->offset() != pc_offset) { + tty->print_cr("oopmap not found, pc_offset: %d, m->offset(): %d", pc_offset, m->offset()); + } assert( m->offset() == pc_offset, "oopmap not found" ); return m; } diff -r 17700eb91e42 -r 0086e1d4fe0c src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.cpp --- a/src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.cpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.cpp Thu Jan 22 13:51:37 2015 +0100 @@ -620,69 +620,6 @@ case ss_c_rarg4: __ push(c_rarg4); break; - case ss_all: - if (dst != rax) { - __ push(rax); - } - if (dst != rbx) { - __ push(rbx); - } - if (dst != rcx) { - __ push(rcx); - } - if (dst != rdx) { - __ push(rdx); - } - if (dst != rdi) { - __ push(rdi); - } - if (dst != rsi) { - __ push(rsi); - } - //if (dst != rbp) { - // __ push(rbp); - // } - if (dst != r8) { - __ push(r8); - } - if (dst != r9) { - __ push(r9); - } - if (dst != r11) { - __ push(r11); - } - if (dst != r12) { - __ push(r12); - } - if (dst != r13) { - __ push(r13); - } - if (dst != r14) { - __ push(r14); - } - if (dst != r15) { - __ push(r15); - } - - __ subptr(rsp, 128); - __ movdbl(Address(rsp, 0), xmm0); - __ movdbl(Address(rsp, 8), xmm1); - __ movdbl(Address(rsp, 16), xmm2); - __ movdbl(Address(rsp, 24), xmm3); - __ movdbl(Address(rsp, 32), xmm4); - __ movdbl(Address(rsp, 40), xmm5); - __ movdbl(Address(rsp, 48), xmm6); - __ movdbl(Address(rsp, 56), xmm7); - __ movdbl(Address(rsp, 64), xmm8); - __ movdbl(Address(rsp, 72), xmm9); - __ movdbl(Address(rsp, 80), xmm10); - __ movdbl(Address(rsp, 88), xmm11); - __ movdbl(Address(rsp, 96), xmm12); - __ movdbl(Address(rsp, 104), xmm13); - __ movdbl(Address(rsp, 112), xmm14); - __ movdbl(Address(rsp, 120), xmm15); - - break; default: ShouldNotReachHere(); @@ -740,68 +677,6 @@ case ss_c_rarg4: __ pop(c_rarg4); break; - case ss_all: - __ movdbl(xmm0, Address(rsp, 0)); - __ movdbl(xmm1, Address(rsp, 8)); - __ movdbl(xmm2, Address(rsp, 16)); - __ movdbl(xmm3, Address(rsp, 24)); - __ movdbl(xmm4, Address(rsp, 32)); - __ movdbl(xmm5, Address(rsp, 40)); - __ movdbl(xmm6, Address(rsp, 48)); - __ movdbl(xmm7, Address(rsp, 56)); - __ movdbl(xmm8, Address(rsp, 64)); - __ movdbl(xmm9, Address(rsp, 72)); - __ movdbl(xmm10, Address(rsp, 80)); - __ movdbl(xmm11, Address(rsp, 88)); - __ movdbl(xmm12, Address(rsp, 96)); - __ movdbl(xmm13, Address(rsp, 104)); - __ movdbl(xmm14, Address(rsp, 112)); - __ movdbl(xmm15, Address(rsp, 120)); - __ addptr(rsp, 128); - - if (dst != r15) { - __ pop(r15); - } - if (dst != r14) { - __ pop(r14); - } - if (dst != r13) { - __ pop(r13); - } - if (dst != r12) { - __ pop(r12); - } - if (dst != r11) { - __ pop(r11); - } - if (dst != r9) { - __ pop(r9); - } - if (dst != r8) { - __ pop(r8); - } - // if (dst != rbp) { - // __ pop(rbp); - // } - if (dst != rsi) { - __ pop(rsi); - } - if (dst != rdi) { - __ pop(rdi); - } - if (dst != rdx) { - __ pop(rdx); - } - if (dst != rcx) { - __ pop(rcx); - } - if (dst != rbx) { - __ pop(rbx); - } - if (dst != rax) { - __ pop(rax); - } - break; default: ShouldNotReachHere(); } diff -r 17700eb91e42 -r 0086e1d4fe0c src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp --- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp Thu Jan 22 13:51:37 2015 +0100 @@ -340,6 +340,10 @@ } } + static address in_cset_fast_test_addr() { + return (address) (ShenandoahHeap::heap()->_in_cset_fast_test); + } + void clear_cset_fast_test() { assert(_in_cset_fast_test_base != NULL, "sanity"); memset(_in_cset_fast_test_base, false, diff -r 17700eb91e42 -r 0086e1d4fe0c src/share/vm/memory/barrierSet.hpp --- a/src/share/vm/memory/barrierSet.hpp Wed Jan 21 01:06:55 2015 +0100 +++ b/src/share/vm/memory/barrierSet.hpp Thu Jan 22 13:51:37 2015 +0100 @@ -68,8 +68,7 @@ ss_c_rarg1, ss_c_rarg2, ss_c_rarg3, - ss_c_rarg4, - ss_all + ss_c_rarg4 }; protected: