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