# HG changeset patch # User neliasso # Date 1524578495 -7200 # Tue Apr 24 16:01:35 2018 +0200 # Node ID bdb5061d858a12db53a1419ea1dacecf9915b360 # Parent 9d8e676896c2dca328ecceb0f2ff35182f0a3e3e [mq]: fix_split_thru_phi diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -1248,6 +1248,7 @@ } } + bool is_strip_mined = region->is_CountedLoop() && region->as_CountedLoop()->is_strip_mined(); Node *phi = oop_phi->clone(); for (uint i = 1; i < region->req(); i++) { @@ -1260,16 +1261,23 @@ if (region->is_Loop() && i == LoopNode::LoopBackControl && ctrl->is_Proj() && ctrl->in(0)->is_If()) { ctrl = ctrl->in(0)->in(0); + } else if (region->is_Loop() && is_strip_mined) { + // If this is a strip mined loop, control must move above OuterStripMinedLoop + assert(i == LoopNode::EntryControl, "check"); + assert(ctrl->is_OuterStripMinedLoop(), "sanity"); + ctrl = ctrl->as_OuterStripMinedLoop()->in(LoopNode::EntryControl); } LoadBarrierNode* new_lb = clone_load_barrier(lb, ctrl, m, lb->in(LoadBarrierNode::Oop)->in(i)); - Node* out_ctrl = new_lb->proj_out(LoadBarrierNode::Control); - if (ctrl == region->in(i)) { + + if (is_strip_mined && (i == LoopNode::EntryControl)) { + assert(region->in(i)->is_OuterStripMinedLoop(), ""); + _igvn.replace_input_of(region->in(i), i, new_lb->proj_out(LoadBarrierNode::Control)); + } else if (ctrl == region->in(i)) { _igvn.replace_input_of(region, i, new_lb->proj_out(LoadBarrierNode::Control)); } else { Node* iff = region->in(i)->in(0); - Node* out_ctrl = new_lb->proj_out(LoadBarrierNode::Control); _igvn.replace_input_of(iff, 0, out_ctrl); set_idom(iff, out_ctrl, dom_depth(out_ctrl)+1); } @@ -1277,7 +1285,6 @@ } } register_new_node(phi, region); - replace_barrier(lb, phi); if (region->is_Loop()) { @@ -1292,6 +1299,7 @@ head->as_CountedLoop()->set_normal_loop(); } } + return true; } }