--- a/src/hotspot/share/opto/loopnode.cpp Thu Mar 22 16:39:02 2018 -0700
+++ b/src/hotspot/share/opto/loopnode.cpp Thu Mar 22 20:21:19 2018 -0700
@@ -1158,9 +1158,9 @@
return NULL;
}
-LoopNode* CountedLoopNode::skip_strip_mined(int expect_opaq) {
+LoopNode* CountedLoopNode::skip_strip_mined(int expect_skeleton) {
if (is_strip_mined()) {
- verify_strip_mined(expect_opaq);
+ verify_strip_mined(expect_skeleton);
return in(EntryControl)->as_Loop();
}
return this;
@@ -1252,6 +1252,20 @@
return l->outer_safepoint();
}
+Node* CountedLoopNode::skip_predicates() {
+ if (is_main_loop()) {
+ Node* ctrl = skip_strip_mined()->in(LoopNode::EntryControl);
+ while (ctrl != NULL && ctrl->is_Proj() && ctrl->in(0)->is_If() &&
+ ctrl->in(0)->as_If()->proj_out(1-ctrl->as_Proj()->_con)->outcnt() == 1 &&
+ ctrl->in(0)->as_If()->proj_out(1-ctrl->as_Proj()->_con)->unique_out()->Opcode() == Op_Halt) {
+ ctrl = ctrl->in(0)->in(0);
+ }
+
+ return ctrl;
+ }
+ return in(LoopNode::EntryControl);
+}
+
void OuterStripMinedLoopNode::adjust_strip_mined_loop(PhaseIterGVN* igvn) {
// Look for the outer & inner strip mined loop, reduce number of
// iterations of the inner loop, set exit condition of outer loop,
@@ -3770,7 +3784,8 @@
if (!cl->is_main_loop() && !cl->is_post_loop()) {
return false;
}
- Node* ctrl = cl->skip_strip_mined()->in(LoopNode::EntryControl);
+ Node* ctrl = cl->skip_predicates();
+
if (ctrl == NULL || (!ctrl->is_IfTrue() && !ctrl->is_IfFalse())) {
return false;
}