--- 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;