--- old/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 2018-11-27 14:44:44.546465106 +0100 +++ new/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 2018-11-27 14:44:39.089510276 +0100 @@ -61,6 +61,7 @@ class IdealKit; class Node; class PhaseGVN; +class PhaseIdealLoop; class PhaseMacroExpand; class Type; class TypePtr; @@ -309,6 +310,7 @@ virtual void igvn_add_users_to_worklist(PhaseIterGVN* igvn, Node* use) const {} virtual void ccp_analyze(PhaseCCP* ccp, Unique_Node_List& worklist, Node* use) const {} + virtual Node* split_if_pre(PhaseIdealLoop* phase, Node* n) const { return NULL; } }; #endif // SHARE_GC_SHARED_C2_BARRIERSETC2_HPP --- old/src/hotspot/share/opto/loopopts.cpp 2018-11-27 14:44:50.220418139 +0100 +++ new/src/hotspot/share/opto/loopopts.cpp 2018-11-27 14:44:44.651464237 +0100 @@ -887,6 +887,11 @@ // Do the real work in a non-recursive function. Data nodes want to be // cloned in the pre-order so they can feed each other nicely. Node *PhaseIdealLoop::split_if_with_blocks_pre( Node *n ) { + BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); + Node* bs_res = bs->split_if_pre(this, n); + if (bs_res != NULL) { + return bs_res; + } // Cloning these guys is unlikely to win int n_op = n->Opcode(); if( n_op == Op_MergeMem ) return n;