< prev index next >
src/hotspot/share/opto/graphKit.cpp
Print this page
rev 50076 : Fold Partial GC into Traversal GC
*** 4096,4106 ****
return false;
}
static void g1_write_barrier_pre_helper(const GraphKit& kit, Node* adr) {
! if (UseShenandoahGC && (ShenandoahSATBBarrier || ShenandoahConditionalSATBBarrier) && adr != NULL) {
Node* c = kit.control();
Node* call = c->in(1)->in(1)->in(1)->in(0);
assert(call->is_g1_wb_pre_call(), "g1_wb_pre call expected");
call->add_req(adr);
}
--- 4096,4106 ----
return false;
}
static void g1_write_barrier_pre_helper(const GraphKit& kit, Node* adr) {
! if (UseShenandoahGC && ShenandoahSATBBarrier && adr != NULL) {
Node* c = kit.control();
Node* call = c->in(1)->in(1)->in(1)->in(0);
assert(call->is_g1_wb_pre_call(), "g1_wb_pre call expected");
call->add_req(adr);
}
*** 4334,4376 ****
if (val != NULL) {
shenandoah_update_matrix(adr, val);
}
- if (ShenandoahConditionalSATBBarrier) {
- enum { _set_path = 1, _not_set_path, PATH_LIMIT };
- RegionNode* region = new RegionNode(PATH_LIMIT);
- Node* prev_mem = memory(Compile::AliasIdxRaw);
- Node* memphi = PhiNode::make(region, prev_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
-
- Node* gc_state_addr_p = _gvn.transform(new CastX2PNode(MakeConX((intptr_t) ShenandoahHeap::gc_state_addr())));
- Node* gc_state_addr = _gvn.transform(new AddPNode(top(), gc_state_addr_p, MakeConX(0)));
- Node* gc_state = _gvn.transform(LoadNode::make(_gvn, control(), memory(Compile::AliasIdxRaw), gc_state_addr, TypeRawPtr::BOTTOM, TypeInt::INT, T_BYTE, MemNode::unordered));
- Node* add_set = _gvn.transform(new AddINode(gc_state, intcon(ShenandoahHeap::MARKING)));
- Node* cmp_set = _gvn.transform(new CmpINode(add_set, intcon(0)));
- Node* cmp_set_bool = _gvn.transform(new BoolNode(cmp_set, BoolTest::eq));
- IfNode* cmp_iff = create_and_map_if(control(), cmp_set_bool, PROB_MIN, COUNT_UNKNOWN);
- Node* if_not_set = _gvn.transform(new IfTrueNode(cmp_iff));
- Node* if_set = _gvn.transform(new IfFalseNode(cmp_iff));
-
- // Conc-mark not in progress. Skip SATB barrier.
- set_control(if_not_set);
- region->init_req(_not_set_path, control());
- memphi->init_req(_not_set_path, prev_mem);
-
- // Conc-mark in progress. Do the SATB barrier.
- set_control(if_set);
- g1_write_barrier_pre(do_load, obj, adr, alias_idx, val, val_type, pre_val, bt);
- region->init_req(_set_path, control());
- memphi->init_req(_set_path, memory(Compile::AliasIdxRaw));
-
- // Merge control flow and memory.
- set_control(_gvn.transform(region));
- record_for_igvn(region);
- set_memory(_gvn.transform(memphi), Compile::AliasIdxRaw);
-
- }
if (ShenandoahSATBBarrier) {
g1_write_barrier_pre(do_load, obj, adr, alias_idx, val, val_type, pre_val, bt);
}
}
--- 4334,4343 ----
*** 4886,4899 ****
}
}
Node* GraphKit::shenandoah_storeval_barrier(Node* obj) {
if (UseShenandoahGC) {
! if (ShenandoahStoreValWriteBarrier || ShenandoahStoreValEnqueueBarrier) {
obj = shenandoah_write_barrier(obj);
- }
- if (ShenandoahStoreValEnqueueBarrier && !ShenandoahMWF) {
shenandoah_enqueue_barrier(obj);
}
if (ShenandoahStoreValReadBarrier) {
obj = shenandoah_read_barrier_impl(obj, true, false, false);
}
--- 4853,4864 ----
}
}
Node* GraphKit::shenandoah_storeval_barrier(Node* obj) {
if (UseShenandoahGC) {
! if (ShenandoahStoreValEnqueueBarrier) {
obj = shenandoah_write_barrier(obj);
shenandoah_enqueue_barrier(obj);
}
if (ShenandoahStoreValReadBarrier) {
obj = shenandoah_read_barrier_impl(obj, true, false, false);
}
*** 4965,4979 ****
}
Node* GraphKit::shenandoah_write_barrier(Node* obj) {
if (UseShenandoahGC && ShenandoahWriteBarrier) {
! obj = shenandoah_write_barrier_impl(obj);
! if (ShenandoahStoreValEnqueueBarrier && ShenandoahMWF) {
! shenandoah_enqueue_barrier(obj);
! }
! return obj;
} else {
return obj;
}
}
--- 4930,4940 ----
}
Node* GraphKit::shenandoah_write_barrier(Node* obj) {
if (UseShenandoahGC && ShenandoahWriteBarrier) {
! return shenandoah_write_barrier_impl(obj);
} else {
return obj;
}
}
< prev index next >