changeset 7454:0086e1d4fe0c

Remove interpreter-type barriers from C1 code. Get rid of write-barrier in unlock in C1.
author Roman Kennke <rkennke@redhat.com>
date Thu, 22 Jan 2015 13:51:37 +0100
parents 17700eb91e42
children b51c76b380cd
files src/cpu/x86/vm/c1_LIRGenerator_x86.cpp src/cpu/x86/vm/c1_MacroAssembler_x86.cpp src/cpu/x86/vm/c1_MacroAssembler_x86.hpp src/share/vm/c1/c1_LIRGenerator.cpp src/share/vm/compiler/oopMap.cpp src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.cpp src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp src/share/vm/memory/barrierSet.hpp
diffstat 8 files changed, 57 insertions(+), 131 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }
 
--- 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
--- 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
--- 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
--- 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;
 }
--- 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();
     }
--- 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,
--- 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: