< prev index next >
src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp
Print this page
rev 58672 : Shenandoah: New incremental-update mode
rev 58673 : [mq]: JDK-8242054-01.patch
@@ -772,11 +772,11 @@
bool ShenandoahBarrierSetC2::array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const {
bool is_oop = is_reference_type(type);
if (!is_oop) {
return false;
}
- if (tightly_coupled_alloc) {
+ if (ShenandoahSATBBarrier && tightly_coupled_alloc) {
if (phase == Optimization) {
return false;
}
return !is_clone;
}
@@ -839,11 +839,15 @@
uint gc_state_idx = Compile::AliasIdxRaw;
const TypePtr* gc_state_adr_type = NULL; // debug-mode-only argument
debug_only(gc_state_adr_type = phase->C->get_adr_type(gc_state_idx));
Node* gc_state = phase->transform_later(new LoadBNode(ctrl, mem, gc_state_addr, gc_state_adr_type, TypeInt::BYTE, MemNode::unordered));
- Node* stable_and = phase->transform_later(new AndINode(gc_state, phase->igvn().intcon(ShenandoahHeap::HAS_FORWARDED)));
+ int flags = ShenandoahHeap::HAS_FORWARDED;
+ if (ShenandoahStoreValEnqueueBarrier) {
+ flags |= ShenandoahHeap::MARKING;
+ }
+ Node* stable_and = phase->transform_later(new AndINode(gc_state, phase->igvn().intcon(flags)));
Node* stable_cmp = phase->transform_later(new CmpINode(stable_and, phase->igvn().zerocon(T_INT)));
Node* stable_test = phase->transform_later(new BoolNode(stable_cmp, BoolTest::ne));
IfNode* stable_iff = phase->transform_later(new IfNode(ctrl, stable_test, PROB_UNLIKELY(0.999), COUNT_UNKNOWN))->as_If();
Node* stable_ctrl = phase->transform_later(new IfFalseNode(stable_iff));
< prev index next >