Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/scripts/ci-test-minimal.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ MMTK_PLAN=MarkSweep runbms_dacapo2006_with_heap_multiplier fop 8
MMTK_PLAN=NoGC runbms_dacapo2006_with_heap_size fop 1000 1000
# Test heap resizing
MMTK_PLAN=GenImmix runbms_dacapo2006_with_heap_size fop 20 100
# Test compressed oops with heap range > 4GB
MMTK_PLAN=GenImmix runbms_dacapo2006_with_heap_size fop 20 5000
# Test no compressed oop
MMTK_PLAN=GenImmix runbms_dacapo2006_with_heap_multiplier fop 4 -XX:-UseCompressedOops -XX:-UseCompressedClassPointers

Expand Down
21 changes: 14 additions & 7 deletions openjdk/barriers/mmtkObjectBarrier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,11 @@ void MMTkObjectBarrierSetRuntime::object_reference_write_post(oop src, oop* slot

#define __ masm->

void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {
void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, bool compensate_val_reg) const {
if (can_remove_barrier(decorators, val, /* skip_const_null */ true)) return;

bool is_not_null = (decorators & IS_NOT_NULL) != 0;

Register obj = dst.base();
#if MMTK_ENABLE_BARRIER_FASTPATH
Label done;
Expand Down Expand Up @@ -67,17 +70,21 @@ void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler*
__ andptr(tmp2, 1);
__ cmpptr(tmp2, 1);
__ jcc(Assembler::notEqual, done);
#endif

__ movptr(c_rarg0, obj);
__ lea(c_rarg1, dst);
__ movptr(c_rarg2, val == noreg ? (int32_t) NULL_WORD : val);
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_slow_call), 3);
__ xorptr(c_rarg1, c_rarg1);
// Note: If `compensate_val_reg == true && UseCompressedOops === true`, the `val` register will be
// holding a compressed pointer to the target object. If the write barrier needs to know the
// target, we will need to decompress it before passing it to the barrier slow path. However,
// since we know the semantics of `ObjectReference`, i.e. it logs the object without looking at
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you mean "the semantics of object remembering barrier"?

We need to a check to know this is object remembering barrier somewhere in the code. We can get it from https://github.com/mmtk/mmtk-core/blob/a75309373cd301acad473bbb8ea04670facd6e2a/src/plan/plan_constraints.rs#L35, and store the value somewhere for the C++ code to access.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you mean "the semantics of object remembering barrier"?

Oops. That's a typo. I did mean ObjectBarrier.

We need to a check to know this is object remembering barrier somewhere in the code.

The changed code is in mmtkObjectBarrier.cpp which is dedicated to the object remembering barrier. The class MMTkObjectBarrierSetAssembler is only used if get_selected_barrier() in mmtkBarrierSet.cpp returns new MMTkObjectBarrier(); Therefore we don't need to check here, as long as the get_selected_barrier() chooses the right barrier.

// the `slot` or the `target` parameter at all, we simply pass nullptr to both parameters.
__ xorptr(c_rarg2, c_rarg2);

#if MMTK_ENABLE_BARRIER_FASTPATH
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_slow_call), 3);
__ bind(done);
#else
__ movptr(c_rarg0, obj);
__ lea(c_rarg1, dst);
__ movptr(c_rarg2, val == noreg ? (int32_t) NULL_WORD : val);
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_post_call), 3);
#endif
}
Expand Down
2 changes: 1 addition & 1 deletion openjdk/barriers/mmtkObjectBarrier.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class MMTkObjectBarrierSetRuntime: public MMTkBarrierSetRuntime {

class MMTkObjectBarrierSetAssembler: public MMTkBarrierSetAssembler {
protected:
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const override;
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, bool compensate_val_reg) const override;
public:
virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) override;
virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) override;
Expand Down
7 changes: 5 additions & 2 deletions openjdk/mmtkBarrierSetAssembler_x86.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ class MMTkBarrierSetAssembler: public BarrierSetAssembler {
/// Full pre-barrier
virtual void object_reference_write_pre(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {}
/// Full post-barrier
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {}
/// `compensate_val_reg` is true if this function is called after `BarrierSetAssembler::store_at` which compresses the pointer in the `val` register in place.
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, bool compensate_val_reg) const {}

/// Barrier elision test
virtual bool can_remove_barrier(DecoratorSet decorators, Register val, bool skip_const_null) const {
Expand All @@ -34,7 +35,9 @@ class MMTkBarrierSetAssembler: public BarrierSetAssembler {
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2) override {
if (type == T_OBJECT || type == T_ARRAY) object_reference_write_pre(masm, decorators, dst, val, tmp1, tmp2);
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
if (type == T_OBJECT || type == T_ARRAY) object_reference_write_post(masm, decorators, dst, val, tmp1, tmp2);
// BarrierSetAssembler::store_at modifies val and make it compressed if UseCompressedOops is true.
// We need to compensate for this change and decode it in object_reference_write_post.
if (type == T_OBJECT || type == T_ARRAY) object_reference_write_post(masm, decorators, dst, val, tmp1, tmp2, true);
}

/// Generate C1 write barrier slow-call stub
Expand Down
Loading