< 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 >