--- old/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp 2019-05-22 11:00:32.000000000 +0200 +++ new/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp 2019-05-22 11:00:32.000000000 +0200 @@ -1191,12 +1191,6 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) { ShenandoahBarrierSetC2State* state = ShenandoahBarrierSetC2::bsc2()->state(); - // Collect raw memory state at CFG points in the entire graph and - // record it in memory_nodes. Optimize the raw memory graph in the - // process. Optimizing the memory graph also makes the memory graph - // simpler. - GrowableArray memory_graph_fixers; - Unique_Node_List uses; for (int i = 0; i < state->enqueue_barriers_count(); i++) { Node* barrier = state->enqueue_barrier(i); @@ -1412,6 +1406,22 @@ } } + for (int i = 0; i < state->load_reference_barriers_count(); i++) { + ShenandoahLoadReferenceBarrierNode* lrb = state->load_reference_barrier(i); + if (lrb->get_barrier_strength() == ShenandoahLoadReferenceBarrierNode::NONE) { + continue; + } + Node* ctrl = phase->get_ctrl(lrb); + IdealLoopTree* loop = phase->get_loop(ctrl); + if (loop->_head->is_OuterStripMinedLoop()) { + // Expanding a barrier here will break loop strip mining + // verification. Transform the loop so the loop nest doesn't + // appear as strip mined. + OuterStripMinedLoopNode* outer = loop->_head->as_OuterStripMinedLoop(); + hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase); + } + } + // Expand load-reference-barriers MemoryGraphFixer fixer(Compile::AliasIdxRaw, true, phase); Unique_Node_List uses_to_ignore; @@ -1431,7 +1441,6 @@ Node* raw_mem = fixer.find_mem(ctrl, lrb); Node* init_raw_mem = raw_mem; Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL); - // int alias = phase->C->get_alias_index(lrb->adr_type()); IdealLoopTree *loop = phase->get_loop(ctrl); CallStaticJavaNode* unc = lrb->pin_and_expand_null_check(phase->igvn()); @@ -2595,7 +2604,11 @@ IdealLoopTree* l = loop; create_phi = false; while (l != _phase->ltree_root()) { - if (_phase->is_dominator(l->_head, u) && _phase->is_dominator(_phase->idom(u), l->_head)) { + Node* head = l->_head; + if (head->in(0) == NULL) { + head = _phase->get_ctrl(head); + } + if (_phase->is_dominator(head, u) && _phase->is_dominator(_phase->idom(u), head)) { create_phi = true; do_check = false; break;