--- old/src/hotspot/share/opto/loopnode.cpp 2018-06-08 19:45:31.091590184 +0200 +++ new/src/hotspot/share/opto/loopnode.cpp 2018-06-08 19:45:30.822578513 +0200 @@ -25,6 +25,8 @@ #include "precompiled.hpp" #include "ci/ciMethodData.hpp" #include "compiler/compileLog.hpp" +#include "gc/shared/barrierSet.hpp" +#include "gc/shared/c2/barrierSetC2.hpp" #include "libadt/vectset.hpp" #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" @@ -213,7 +215,8 @@ if (nb_ctl_proj > 1) { break; } - assert(parent_ctl->is_Start() || parent_ctl->is_MemBar() || parent_ctl->is_Call(), "unexpected node"); + assert(parent_ctl->is_Start() || parent_ctl->is_MemBar() || parent_ctl->is_Call() || + BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(parent_ctl), "unexpected node"); assert(idom(ctl) == parent_ctl, "strange"); next = idom(parent_ctl); } @@ -2635,7 +2638,7 @@ //----------------------------build_and_optimize------------------------------- // Create a PhaseLoop. Build the ideal Loop tree. Map each Ideal Node to // its corresponding LoopNode. If 'optimize' is true, do some loop cleanups. -void PhaseIdealLoop::build_and_optimize(bool do_split_ifs, bool skip_loop_opts) { +void PhaseIdealLoop::build_and_optimize(bool do_split_ifs, bool skip_loop_opts, bool last_round) { ResourceMark rm; int old_progress = C->major_progress(); @@ -2877,8 +2880,11 @@ // that require basic-block info (like cloning through Phi's) if( SplitIfBlocks && do_split_ifs ) { visited.Clear(); - split_if_with_blocks( visited, nstack ); + split_if_with_blocks( visited, nstack, last_round ); NOT_PRODUCT( if( VerifyLoopOptimizations ) verify(); ); + if (last_round) { + C->set_major_progress(); + } } if (!C->major_progress() && do_expensive_nodes && process_expensive_nodes()) { @@ -4131,6 +4137,8 @@ case Op_LoadL: case Op_LoadS: case Op_LoadP: + case Op_LoadBarrierSlowReg: + case Op_LoadBarrierWeakSlowReg: case Op_LoadN: case Op_LoadRange: case Op_LoadD_unaligned: