< 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,1273 ****
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 */);
}
// Example: clazz.isInstance(object)
void LIRGenerator::do_isInstance(Intrinsic* x) {
assert(x->number_of_arguments() == 2, "wrong type");
--- 1259,1269 ----
LIR_Opr result = rlock_result(x);
__ load(referent_field_adr, result, info);
// Register the value in the referent field with the pre-barrier
! keep_alive_barrier(result);
}
// Example: clazz.isInstance(object)
void LIRGenerator::do_isInstance(Intrinsic* x) {
assert(x->number_of_arguments() == 2, "wrong type");
*** 1487,1496 ****
--- 1483,1522 ----
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 >