Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 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
4 changes: 4 additions & 0 deletions .github/scripts/ci-test-only-normal.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ run_all 4
# Test heap resizing
runbms_dacapo2006_with_heap_size fop 20 100

# Test compressed oops with heap range > 4GB
# When the heap size is larger than 4GiB, compressed oops will be shifted by 3 bits.
runbms_dacapo2006_with_heap_size fop 20 5000
Copy link
Member

Choose a reason for hiding this comment

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

I added tests here as a separate job: #292. We can either remove the test here, or close that PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'll remove this test because #292 tests with multiple plans, and GenImmix may not be the only plan affected by the compressed oops.

I'll keep the one I added to ci-test-minimal.sh so that it will be executed for every new commit in mmtk-core.


# --- StickyImmix ---
export MMTK_PLAN=StickyImmix

Expand Down
26 changes: 20 additions & 6 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,28 @@ 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);
if (val == noreg) {
__ xorptr(c_rarg2, c_rarg2);
} else {
if (compensate_val_reg && UseCompressedOops) {
// `val` is compressed. Decompress it.
if (is_not_null) {
__ decode_heap_oop_not_null(val);
} else {
__ decode_heap_oop(val);
}
}
__ movptr(c_rarg2, val);
}

#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