< prev index next >
src/share/vm/opto/split_if.cpp
Print this page
*** 30,39 ****
--- 30,40 ----
//------------------------------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(), "" );
Node *r = new RegionNode( region->req() );
IdealLoopTree *loop = get_loop( n );
*** 71,81 ****
if( get_ctrl(n) != blk1 && get_ctrl(n) != blk2 )
return false; // Not block local
if( n->is_Phi() ) return false; // Local PHIs are expected
// Recursively split-up inputs
! for (uint i = 1; i < n->req(); i++) {
if( split_up( n->in(i), blk1, blk2 ) ) {
// Got split recursively and self went dead?
if (n->outcnt() == 0)
_igvn.remove_dead_node(n);
return true;
--- 72,83 ----
if( get_ctrl(n) != blk1 && get_ctrl(n) != blk2 )
return false; // Not block local
if( n->is_Phi() ) return false; // Local PHIs are expected
// Recursively split-up inputs
! 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)
_igvn.remove_dead_node(n);
return true;
*** 214,223 ****
--- 216,226 ----
}
// Announce phi to optimizer
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,
// but it is not needed. All necessary forward walking is done
// by do_split_if() below.)
< prev index next >