< prev index next >

src/share/vm/c1/c1_LIRGenerator.cpp

Print this page
rev 14282 : Factor out keep-alive barrier from usual pre-barrier implementations.

@@ -1259,15 +1259,11 @@
   LIR_Opr result = rlock_result(x);
 
   __ load(referent_field_adr, result, info);
 
   // Register the value in the referent field with the pre-barrier
-  pre_barrier(LIR_OprFact::illegalOpr /* addr_opr */,
-              result /* pre_val */,
-              false  /* do_load */,
-              false  /* patch */,
-              NULL   /* info */);
+  keep_alive_barrier(result);
 }
 
 // Example: clazz.isInstance(object)
 void LIRGenerator::do_isInstance(Intrinsic* x) {
   assert(x->number_of_arguments() == 2, "wrong type");

@@ -1487,10 +1483,40 @@
       ShouldNotReachHere();
 
   }
 }
 
+void LIRGenerator::keep_alive_barrier(LIR_Opr val) {
+  switch (_bs->kind()) {
+#if INCLUDE_ALL_GCS
+    case BarrierSet::G1SATBCTLogging:
+      pre_barrier(LIR_OprFact::illegalOpr /* addr_opr */,
+                  val /* pre_val */,
+                  false  /* do_load */,
+                  false  /* patch */,
+                  NULL   /* info */);
+      break;
+    case BarrierSet::ShenandoahBarrierSet:
+      if (ShenandoahKeepAliveBarrier) {
+        pre_barrier(LIR_OprFact::illegalOpr /* addr_opr */,
+                    val /* pre_val */,
+                    false  /* do_load */,
+                    false  /* patch */,
+                    NULL   /* info */);
+      }
+      break;
+#endif // INCLUDE_ALL_GCS
+    case BarrierSet::CardTableForRS:
+    case BarrierSet::CardTableExtension:
+      break;
+    case BarrierSet::ModRef:
+      break;
+    default      :
+      ShouldNotReachHere();
+  }
+}
+
 void LIRGenerator::post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val) {
   switch (_bs->kind()) {
 #if INCLUDE_ALL_GCS
     case BarrierSet::G1SATBCTLogging:
       G1SATBCardTableModRef_post_barrier(addr,  new_val);
< prev index next >