39 lines
1.5 KiB
Diff
39 lines
1.5 KiB
Diff
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
|
|
|