--- old/src/share/vm/opto/split_if.cpp 2015-10-08 22:15:55.363120217 +0200 +++ new/src/share/vm/opto/split_if.cpp 2015-10-08 22:15:55.314121388 +0200 @@ -32,6 +32,7 @@ //------------------------------split_thru_region------------------------------ // Split Node 'n' through merge point. Node *PhaseIdealLoop::split_thru_region( Node *n, Node *region ) { + assert(n->Opcode() != Op_ShenandoahWriteBarrier, "not with write barriers"); uint wins = 0; assert( n->is_CFG(), "" ); assert( region->is_Region(), "" ); @@ -73,7 +74,8 @@ if( n->is_Phi() ) return false; // Local PHIs are expected // Recursively split-up inputs - for (uint i = 1; i < n->req(); i++) { + uint first_input = n->Opcode() == Op_ShenandoahWBMemProj ? 0 : 1; + for (uint i = first_input; i < n->req(); i++) { if( split_up( n->in(i), blk1, blk2 ) ) { // Got split recursively and self went dead? if (n->outcnt() == 0) @@ -216,6 +218,7 @@ register_new_node(phi, blk1); // Remove cloned-up value from optimizer; use phi instead + split_mem_thru_phi(n, blk1, phi); _igvn.replace_node( n, phi ); // (There used to be a self-recursive call to split_up() here,