--- old/src/hotspot/share/opto/loopopts.cpp 2018-02-14 10:51:56.165260047 +0100 +++ new/src/hotspot/share/opto/loopopts.cpp 2018-02-14 10:51:51.731257438 +0100 @@ -1094,9 +1094,16 @@ // For inner loop uses move it to the preheader area. Node *PhaseIdealLoop::place_near_use( Node *useblock ) const { IdealLoopTree *u_loop = get_loop( useblock ); - return (u_loop->_irreducible || u_loop->_child) - ? useblock - : u_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl); + if (u_loop->_irreducible) { + return useblock; + } + if (u_loop->_child) { + if (useblock == u_loop->_head && u_loop->_head->is_OuterStripMinedLoop()) { + return u_loop->_head->in(LoopNode::EntryControl); + } + return useblock; + } + return u_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl); } @@ -1106,6 +1113,7 @@ } Node* region = NULL; bool shenandoah_evac = ShenandoahWriteBarrierNode::is_evacuation_in_progress_test(n); + bool shenandoah_heap_stable = ShenandoahWriteBarrierNode::is_heap_stable_test(n); if (shenandoah_evac) { assert(UseShenandoahGC, "for shenandoah only"); region = ShenandoahWriteBarrierNode::evacuation_in_progress_test_ctrl(n); @@ -1124,6 +1132,10 @@ if (!ShenandoahWriteBarrierNode::is_evacuation_in_progress_test(dom)) { return false; } + } else if (shenandoah_heap_stable) { + if (!ShenandoahWriteBarrierNode::is_heap_stable_test(dom)) { + return false; + } } else { if (dom->in(1) != n->in(1)) { return false;