Skip to content

Commit 3fc41cc

Browse files
authored
Set allocation bit on allocation fast path (#103)
1 parent 383abe6 commit 3fc41cc

File tree

10 files changed

+177
-1
lines changed

10 files changed

+177
-1
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
set -xe
2+
3+
unset JAVA_TOOL_OPTIONS
4+
5+
# To OpenJDK folder
6+
root_dir=$(dirname "$0")/../../
7+
cd $root_dir/repos/openjdk
8+
9+
# Choose build: use slowdebug for shorter build time (32m user time for release vs. 20m user time for slowdebug)
10+
export DEBUG_LEVEL=fastdebug
11+
export MMTK_EXTREME_ASSERTIONS=0
12+
export GLOBAL_ALLOC_BIT=1
13+
echo $RUSTUP_TOOLCHAIN
14+
15+
# Build
16+
sh configure --disable-warnings-as-errors --with-debug-level=$DEBUG_LEVEL
17+
make CONF=linux-x86_64-normal-server-$DEBUG_LEVEL THIRD_PARTY_HEAP=$PWD/../../openjdk
18+
19+
# --- SemiSpace ---
20+
export MMTK_PLAN=SemiSpace
21+
22+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar antlr
23+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar fop
24+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar luindex
25+
26+
27+
# --- Immix ---
28+
export MMTK_PLAN=Immix
29+
30+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar antlr
31+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar fop
32+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar luindex
33+
34+
# --- GenCopy ---
35+
export MMTK_PLAN=GenCopy
36+
37+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar antlr
38+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar fop
39+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar luindex
40+
41+
# --- NoGC ---
42+
43+
export MMTK_PLAN=NoGC
44+
45+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar antlr
46+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar fop
47+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar luindex
48+
49+
50+
# --- MarkSweep ---
51+
export MMTK_PLAN=MarkSweep
52+
53+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar antlr
54+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar fop
55+
build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -XX:-TieredCompilation -Xcomp -jar benchmarks/dacapo-2006-10-MR2.jar luindex
56+

.github/scripts/ci-test.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ cd $cur
55
./ci-test-normal.sh
66
cd $cur
77
./ci-test-assertions.sh
8+
cd $cur
9+
./ci-test-global-alloc-bit.sh

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ jobs:
2323
# Run the tests
2424
- name: Dacapo Tests
2525
run: ./.github/scripts/ci-test-normal.sh
26+
- name: DaCapo Tests for Global Allocation Bit
27+
run: ./.github/scripts/ci-test-global-alloc-bit.sh
2628

2729
# Style check
2830
- name: Style checks

mmtk/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ lazy_static = "1.1"
2020
# - change branch
2121
# - change repo name
2222
# But other changes including adding/removing whitespaces in commented lines may break the CI.
23-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "53a46c559c6c48080730625b4749f43cf52841ad" }
23+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "e581539f25d050bd34a541e783351ff5f44095aa" }
2424
# Uncomment the following to build locally
2525
# mmtk = { path = "../repos/mmtk-core" }
2626

@@ -29,6 +29,7 @@ default = []
2929
mmtk_extreme_assertions = ["mmtk/extreme_assertions"]
3030
nogc_lock_free = ["mmtk/nogc_lock_free"]
3131
nogc_no_zeroing = ["mmtk/nogc_no_zeroing"]
32+
global_alloc_bit = ["mmtk/global_alloc_bit"]
3233

3334
# This compile time constant places the mark bit in the header of the object instead of on the side.
3435
mark_bit_in_header = []

mmtk/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,18 @@ pub struct OpenJDK_Upcalls {
8585

8686
pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut();
8787

88+
#[no_mangle]
89+
pub static GLOBAL_SIDE_METADATA_BASE_ADDRESS: uintptr_t =
90+
crate::mmtk::util::metadata::side_metadata::GLOBAL_SIDE_METADATA_BASE_ADDRESS.as_usize();
91+
8892
#[no_mangle]
8993
pub static GLOBAL_SIDE_METADATA_VM_BASE_ADDRESS: uintptr_t =
9094
crate::mmtk::util::metadata::side_metadata::GLOBAL_SIDE_METADATA_VM_BASE_ADDRESS.as_usize();
9195

96+
#[no_mangle]
97+
pub static GLOBAL_ALLOC_BIT_ADDRESS: uintptr_t =
98+
crate::mmtk::util::metadata::side_metadata::ALLOC_SIDE_METADATA_ADDR.as_usize();
99+
92100
#[derive(Default)]
93101
pub struct OpenJDK;
94102

openjdk/CompileThirdPartyHeap.gmk

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ ifdef MMTK_PLAN
66
GC_FEATURES=--features $(MMTK_PLAN)
77
endif
88

9+
ifeq ($(GLOBAL_ALLOC_BIT), 1)
10+
ifndef GC_FEATURES
11+
GC_FEATURES=--features global_alloc_bit
12+
else
13+
GC_FEATURES:=$(strip $(GC_FEATURES))",global_alloc_bit"
14+
endif
15+
endif
16+
917
ifeq ($(MARK_IN_HEADER), 1)
1018
ifndef GC_FEATURES
1119
GC_FEATURES=--features mark_bit_in_header
@@ -44,5 +52,8 @@ FORCE:
4452
TARGETS += $(LIB_MMTK)
4553
JVM_SRC_DIRS += $(MMTK_CPP_ROOT) $(MMTK_CPP_ROOT)/barriers
4654
JVM_CFLAGS += -std=c++11 -DINCLUDE_THIRD_PARTY_HEAP -DTHIRD_PARTY_HEAP_SRC=$(MMTK_CPP_ROOT)
55+
ifeq ($(GLOBAL_ALLOC_BIT), 1)
56+
JVM_CFLAGS += -DMMTK_ENABLE_GLOBAL_ALLOC_BIT
57+
endif
4758

4859
$(BUILD_LIBJVM): $(LIB_MMTK)

openjdk/mmtk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ extern "C" {
1212
typedef void* MMTk_Mutator;
1313
typedef void* MMTk_TraceLocal;
1414

15+
extern const uintptr_t GLOBAL_SIDE_METADATA_BASE_ADDRESS;
1516
extern const uintptr_t GLOBAL_SIDE_METADATA_VM_BASE_ADDRESS;
17+
extern const uintptr_t GLOBAL_ALLOC_BIT_ADDRESS;
1618

1719
/**
1820
* Allocation

openjdk/mmtkBarrierSet.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838

3939
#define MMTK_ENABLE_ALLOCATION_FASTPATH true
4040

41+
const intptr_t ALLOC_BIT_BASE_ADDRESS = GLOBAL_ALLOC_BIT_ADDRESS;
42+
4143
class MMTkBarrierSetRuntime: public CHeapObj<mtGC> {
4244
public:
4345
virtual void record_modified_node(oop object) {};

openjdk/mmtkBarrierSetAssembler_x86.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,39 @@ void MMTkBarrierSetAssembler::eden_allocate(MacroAssembler* masm, Register threa
110110
__ jcc(Assembler::above, slow_case);
111111
// lab.cursor = end
112112
__ movptr(cursor, end);
113+
114+
#ifdef MMTK_ENABLE_GLOBAL_ALLOC_BIT
115+
Register tmp3 = rscratch2;
116+
Register tmp2 = rscratch1;
117+
Register tmp4 = t1;
118+
assert_different_registers(obj, tmp2, tmp3, tmp4, rcx);
119+
120+
// tmp2 = load-byte (SIDE_METADATA_BASE_ADDRESS + (obj >> 6));
121+
__ movptr(tmp3, obj);
122+
__ shrptr(tmp3, 6);
123+
__ movptr(tmp2, ALLOC_BIT_BASE_ADDRESS);
124+
__ movb(tmp2, Address(tmp2, tmp3));
125+
// tmp3 = 1 << ((obj >> 3) & 7)
126+
// 1. tmp4 = (obj >> 3) & 7
127+
__ movptr(tmp4, obj);
128+
__ shrptr(tmp4, 3);
129+
__ andptr(tmp4, 7);
130+
// 2. tmp4 = 1 << tmp4
131+
__ movptr(tmp3, rcx);
132+
__ movl(rcx, tmp4);
133+
__ movptr(tmp4, 1);
134+
__ shlptr(tmp4);
135+
__ movptr(rcx, tmp3);
136+
// tmp2 = tmp2 | tmp4
137+
__ orptr(tmp2, tmp4);
138+
139+
// store-byte tmp2 (SIDE_METADATA_BASE_ADDRESS + (obj >> 6))
140+
__ movptr(tmp3, obj);
141+
__ shrptr(tmp3, 6);
142+
__ movptr(tmp4, ALLOC_BIT_BASE_ADDRESS);
143+
__ movb(Address(tmp4, tmp3), tmp2);
144+
#endif
145+
113146
// BarrierSetAssembler::incr_allocated_bytes
114147
if (var_size_in_bytes->is_valid()) {
115148
__ addq(Address(r15_thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);

openjdk/mmtkBarrierSetC2.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,65 @@ void MMTkBarrierSetC2::expand_allocate(PhaseMacroExpand* x,
277277
fast_oop_ctrl = needgc_false; // No contention, so this is the fast path
278278
fast_oop_rawmem = store_eden_top;
279279

280+
#ifdef MMTK_ENABLE_GLOBAL_ALLOC_BIT
281+
// set the alloc bit:
282+
// intptr_t addr = (intptr_t) (void*) fast_oop;
283+
// uint8_t* meta_addr = (uint8_t*) (ALLOC_BIT_BASE_ADDRESS + (addr >> 6));
284+
// intptr_t shift = (addr >> 3) & 0b111;
285+
// uint8_t byte_val = *meta_addr;
286+
// uint8_t new_byte_val = byte_val | (1 << shift);
287+
// *meta_addr = new_byte_val;
288+
Node *obj_addr = new CastP2XNode(fast_oop_ctrl, fast_oop);
289+
x->transform_later(obj_addr);
290+
291+
Node *addr_shift = ConINode::make(6);
292+
x->transform_later(addr_shift);
293+
294+
Node *meta_offset = new URShiftLNode(obj_addr, addr_shift);
295+
x->transform_later(meta_offset);
296+
297+
Node *meta_base = ConLNode::make(ALLOC_BIT_BASE_ADDRESS);
298+
x->transform_later(meta_base);
299+
300+
Node *meta_addr = new AddLNode(meta_base, meta_offset);
301+
x->transform_later(meta_addr);
302+
303+
Node *meta_addr_p = new CastX2PNode(meta_addr);
304+
x->transform_later(meta_addr_p);
305+
306+
Node *meta_val = new LoadUBNode(fast_oop_ctrl, fast_oop_rawmem, meta_addr_p, TypePtr::BOTTOM, TypeInt::BYTE, MemNode::unordered);
307+
x->transform_later(meta_val);
308+
309+
Node *meta_val_shift = ConINode::make(3);
310+
x->transform_later(meta_val_shift);
311+
312+
Node *shifted_addr = new URShiftLNode(obj_addr, meta_val_shift);
313+
x->transform_later(shifted_addr);
314+
315+
Node *meta_val_mask = ConLNode::make(0b111);
316+
x->transform_later(meta_val_mask);
317+
318+
Node *shifted_masked_addr = new AndLNode(shifted_addr, meta_val_mask);
319+
x->transform_later(shifted_masked_addr);
320+
321+
Node *const_one = ConINode::make(1);
322+
x->transform_later(const_one);
323+
324+
Node *shifted_masked_addr_i = new ConvL2INode(shifted_masked_addr);
325+
x->transform_later(shifted_masked_addr_i);
326+
327+
Node *set_bit = new LShiftINode(const_one, shifted_masked_addr_i);
328+
x->transform_later(set_bit);
329+
330+
Node *new_meta_val = new OrINode(meta_val, set_bit);
331+
x->transform_later(new_meta_val);
332+
333+
Node *set_alloc_bit = new StoreBNode(fast_oop_ctrl, fast_oop_rawmem, meta_addr_p, TypeRawPtr::BOTTOM, new_meta_val, MemNode::unordered);
334+
x->transform_later(set_alloc_bit);
335+
336+
fast_oop_rawmem = set_alloc_bit;
337+
#endif
338+
280339
InitializeNode* init = alloc->initialization();
281340
fast_oop_rawmem = x->initialize_object(alloc,
282341
fast_oop_ctrl, fast_oop_rawmem, fast_oop,

0 commit comments

Comments
 (0)