< prev index next >

src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp

Print this page

        

*** 773,783 **** 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 (phase == Optimization) { return false; } return !is_clone; } --- 773,783 ---- 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 && ShenandoahSATBBarrier) { if (phase == Optimization) { return false; } return !is_clone; }
*** 840,850 **** 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))); 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)); --- 840,854 ---- 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)); ! 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 >