Subject: 8223486: split-if update_uses accesses stale idom data
---
 hotspot/src/share/vm/opto/split_if.cpp | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/hotspot/src/share/vm/opto/split_if.cpp b/hotspot/src/share/vm/opto/split_if.cpp
index 94d680c11..636af191d 100644
--- a/hotspot/src/share/vm/opto/split_if.cpp
+++ b/hotspot/src/share/vm/opto/split_if.cpp
@@ -486,7 +486,9 @@ void PhaseIdealLoop::do_split_if( Node *iff ) {
   }
   _igvn.remove_dead_node(new_iff);
   // Lazy replace IDOM info with the region's dominator
-  lazy_replace( iff, region_dom );
+  lazy_replace(iff, region_dom);
+  lazy_update(region, region_dom); // idom must be update before handle_uses
+  region->set_req(0, NULL);        // Break the self-cycle. Required for lazy_update to work on region
 
   // Now make the original merge point go dead, by handling all its uses.
   small_cache region_cache;
@@ -529,13 +531,8 @@ void PhaseIdealLoop::do_split_if( Node *iff ) {
     --k;
   } // End of while merge point has phis
 
-  assert(region->outcnt() == 1, "Only self reference should remain"); // Just Self on the Region
-  region->set_req(0, NULL);       // Break the self-cycle
+  _igvn.remove_dead_node(region);
 
-  // Any leftover bits in the splitting block must not have depended on local
-  // Phi inputs (these have already been split-up).  Hence it's safe to hoist
-  // these guys to the dominating point.
-  lazy_replace( region, region_dom );
 #ifndef PRODUCT
   if( VerifyLoopOptimizations ) verify();
 #endif
-- 
2.19.1

