--- old/src/share/vm/opto/split_if.cpp 2015-10-14 13:54:29.977508412 +0200 +++ new/src/share/vm/opto/split_if.cpp 2015-10-14 13:54:29.888510564 +0200 @@ -73,7 +73,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 +217,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,