mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
8356289: Shenandoah: Clean up SATB barrier runtime entry points
Reviewed-by: kdnilsen, ysr, wkemper
This commit is contained in:
parent
603526b55b
commit
f28f618972
@ -172,9 +172,9 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
|
||||
|
||||
if (expand_call) {
|
||||
assert(pre_val != c_rarg1, "smashed arg");
|
||||
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, thread);
|
||||
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
} else {
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
}
|
||||
|
||||
__ pop(saved, sp);
|
||||
@ -753,7 +753,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
|
||||
__ bind(runtime);
|
||||
__ push_call_clobbered_registers();
|
||||
__ load_parameter(0, pre_val);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
__ pop_call_clobbered_registers();
|
||||
__ bind(done);
|
||||
|
||||
|
||||
@ -311,7 +311,7 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_impl(MacroAssembler *masm
|
||||
}
|
||||
|
||||
// Invoke runtime.
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, R16_thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
|
||||
// Restore to-be-preserved registers.
|
||||
if (!preserve_gp_registers && preloaded_mode && pre_val->is_volatile()) {
|
||||
@ -966,7 +966,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
|
||||
__ push_frame_reg_args(nbytes_save, R11_tmp1);
|
||||
|
||||
// Invoke runtime.
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), R0_pre_val, R16_thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), R0_pre_val);
|
||||
|
||||
// Restore to-be-preserved registers.
|
||||
__ pop_frame();
|
||||
|
||||
@ -172,9 +172,9 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
|
||||
// expand_call should be passed true.
|
||||
if (expand_call) {
|
||||
assert(pre_val != c_rarg1, "smashed arg");
|
||||
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, thread);
|
||||
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
} else {
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
}
|
||||
|
||||
__ pop_reg(saved, sp);
|
||||
@ -702,7 +702,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
|
||||
__ bind(runtime);
|
||||
__ push_call_clobbered_registers();
|
||||
__ load_parameter(0, pre_val);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), pre_val, thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), pre_val);
|
||||
__ pop_call_clobbered_registers();
|
||||
__ bind(done);
|
||||
|
||||
|
||||
@ -276,9 +276,9 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
|
||||
__ mov(c_rarg1, thread);
|
||||
}
|
||||
// Already moved pre_val into c_rarg0 above
|
||||
__ MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), 2);
|
||||
__ MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), 1);
|
||||
} else {
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), c_rarg0, thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), c_rarg0);
|
||||
}
|
||||
|
||||
// save the live input values
|
||||
@ -946,7 +946,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
|
||||
|
||||
// load the pre-value
|
||||
__ load_parameter(0, rcx);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), rcx, thread);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), rcx);
|
||||
|
||||
__ restore_live_registers(true);
|
||||
|
||||
|
||||
@ -1369,7 +1369,7 @@ void AOTCodeAddressTable::init_extrs() {
|
||||
SET_ADDRESS(_extrs, G1BarrierSetRuntime::write_ref_field_pre_entry);
|
||||
#endif
|
||||
#if INCLUDE_SHENANDOAHGC
|
||||
SET_ADDRESS(_extrs, ShenandoahRuntime::write_ref_field_pre);
|
||||
SET_ADDRESS(_extrs, ShenandoahRuntime::write_barrier_pre);
|
||||
SET_ADDRESS(_extrs, ShenandoahRuntime::load_reference_barrier_phantom);
|
||||
SET_ADDRESS(_extrs, ShenandoahRuntime::load_reference_barrier_phantom_narrow);
|
||||
#endif
|
||||
|
||||
@ -250,9 +250,8 @@ void ShenandoahBarrierSetC2::satb_write_barrier_pre(GraphKit* kit,
|
||||
} __ else_(); {
|
||||
|
||||
// logging buffer is full, call the runtime
|
||||
const TypeFunc *tf = ShenandoahBarrierSetC2::write_ref_field_pre_Type();
|
||||
__ make_leaf_call(tf, CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre), "shenandoah_wb_pre",
|
||||
pre_val, tls);
|
||||
const TypeFunc *tf = ShenandoahBarrierSetC2::write_barrier_pre_Type();
|
||||
__ make_leaf_call(tf, CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre), "shenandoah_wb_pre", pre_val);
|
||||
} __ end_if(); // (!index)
|
||||
} __ end_if(); // (pre_val != nullptr)
|
||||
} __ end_if(); // (!marking)
|
||||
@ -270,7 +269,7 @@ void ShenandoahBarrierSetC2::satb_write_barrier_pre(GraphKit* kit,
|
||||
|
||||
bool ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(Node* call) {
|
||||
return call->is_CallLeaf() &&
|
||||
call->as_CallLeaf()->entry_point() == CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre);
|
||||
call->as_CallLeaf()->entry_point() == CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_pre);
|
||||
}
|
||||
|
||||
bool ShenandoahBarrierSetC2::is_shenandoah_clone_call(Node* call) {
|
||||
@ -520,11 +519,10 @@ void ShenandoahBarrierSetC2::post_barrier(GraphKit* kit,
|
||||
|
||||
#undef __
|
||||
|
||||
const TypeFunc* ShenandoahBarrierSetC2::write_ref_field_pre_Type() {
|
||||
const Type **fields = TypeTuple::fields(2);
|
||||
const TypeFunc* ShenandoahBarrierSetC2::write_barrier_pre_Type() {
|
||||
const Type **fields = TypeTuple::fields(1);
|
||||
fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
|
||||
fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // thread
|
||||
const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
|
||||
const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
|
||||
|
||||
// create result type (range)
|
||||
fields = TypeTuple::fields(0);
|
||||
@ -1108,7 +1106,7 @@ void ShenandoahBarrierSetC2::verify_gc_barriers(Compile* compile, CompilePhase p
|
||||
|
||||
Node* ShenandoahBarrierSetC2::ideal_node(PhaseGVN* phase, Node* n, bool can_reshape) const {
|
||||
if (is_shenandoah_wb_pre_call(n)) {
|
||||
uint cnt = ShenandoahBarrierSetC2::write_ref_field_pre_Type()->domain()->cnt();
|
||||
uint cnt = ShenandoahBarrierSetC2::write_barrier_pre_Type()->domain()->cnt();
|
||||
if (n->req() > cnt) {
|
||||
Node* addp = n->in(cnt);
|
||||
if (has_only_shenandoah_wb_pre_uses(addp)) {
|
||||
@ -1194,7 +1192,7 @@ bool ShenandoahBarrierSetC2::final_graph_reshaping(Compile* compile, Node* n, ui
|
||||
assert (n->is_Call(), "");
|
||||
CallNode *call = n->as_Call();
|
||||
if (ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(call)) {
|
||||
uint cnt = ShenandoahBarrierSetC2::write_ref_field_pre_Type()->domain()->cnt();
|
||||
uint cnt = ShenandoahBarrierSetC2::write_barrier_pre_Type()->domain()->cnt();
|
||||
if (call->req() > cnt) {
|
||||
assert(call->req() == cnt + 1, "only one extra input");
|
||||
Node *addp = call->in(cnt);
|
||||
|
||||
@ -103,7 +103,7 @@ public:
|
||||
|
||||
ShenandoahBarrierSetC2State* state() const;
|
||||
|
||||
static const TypeFunc* write_ref_field_pre_Type();
|
||||
static const TypeFunc* write_barrier_pre_Type();
|
||||
static const TypeFunc* clone_barrier_Type();
|
||||
static const TypeFunc* load_reference_barrier_Type();
|
||||
virtual bool has_load_barrier_nodes() const { return true; }
|
||||
|
||||
@ -38,20 +38,16 @@ JRT_LEAF(void, ShenandoahRuntime::arraycopy_barrier_narrow_oop(narrowOop* src, n
|
||||
ShenandoahBarrierSet::barrier_set()->arraycopy_barrier(src, dst, length);
|
||||
JRT_END
|
||||
|
||||
JRT_LEAF(void, ShenandoahRuntime::write_ref_field_pre(oopDesc * orig, JavaThread * thread))
|
||||
assert(thread == JavaThread::current(), "pre-condition");
|
||||
JRT_LEAF(void, ShenandoahRuntime::write_barrier_pre(oopDesc* orig))
|
||||
assert(orig != nullptr, "should be optimized out");
|
||||
shenandoah_assert_correct(nullptr, orig);
|
||||
// Capture the original value that was in the field reference.
|
||||
JavaThread* thread = JavaThread::current();
|
||||
assert(ShenandoahThreadLocalData::satb_mark_queue(thread).is_active(), "Shouldn't be here otherwise");
|
||||
SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
|
||||
ShenandoahBarrierSet::satb_mark_queue_set().enqueue_known_active(queue, orig);
|
||||
JRT_END
|
||||
|
||||
void ShenandoahRuntime::write_barrier_pre(oopDesc* orig) {
|
||||
write_ref_field_pre(orig, JavaThread::current());
|
||||
}
|
||||
|
||||
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_strong(oopDesc* src, oop* load_addr))
|
||||
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator(src, load_addr);
|
||||
JRT_END
|
||||
|
||||
@ -36,7 +36,6 @@ public:
|
||||
static void arraycopy_barrier_oop(oop* src, oop* dst, size_t length);
|
||||
static void arraycopy_barrier_narrow_oop(narrowOop* src, narrowOop* dst, size_t length);
|
||||
|
||||
static void write_ref_field_pre(oopDesc* orig, JavaThread* thread);
|
||||
static void write_barrier_pre(oopDesc* orig);
|
||||
|
||||
static oopDesc* load_reference_barrier_strong(oopDesc* src, oop* load_addr);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user