diff --git a/src/hotspot/share/opto/domgraph.cpp b/src/hotspot/share/opto/domgraph.cpp index a80358e1d0f..b52f4232c4e 100644 --- a/src/hotspot/share/opto/domgraph.cpp +++ b/src/hotspot/share/opto/domgraph.cpp @@ -233,9 +233,21 @@ uint Block_Stack::most_frequent_successor( Block *b ) { case Op_Jump: case Op_Root: case Op_Goto: - case Op_NeverBranch: freq_idx = 0; // fall thru break; + case Op_NeverBranch: { + Node* succ = n->as_NeverBranch()->proj_out(0)->unique_ctrl_out(); + int succ_idx = 0; // normal case + if (succ == b->_succs[1]->head()) { + // Edges swapped, rare case. May happen due to an unusual matcher + // traversal order for peeled infinite loops. + succ_idx = 1; + } else { + assert(succ == b->_succs[0]->head(), "succ not found"); + } + freq_idx = succ_idx; + break; + } case Op_TailCall: case Op_TailJump: case Op_ForwardException: diff --git a/src/hotspot/share/opto/gcm.cpp b/src/hotspot/share/opto/gcm.cpp index eeab96de3fa..a8080d5adb9 100644 --- a/src/hotspot/share/opto/gcm.cpp +++ b/src/hotspot/share/opto/gcm.cpp @@ -2160,8 +2160,13 @@ float Block::succ_prob(uint i) { // Pass frequency straight thru to target return 1.0f; - case Op_NeverBranch: + case Op_NeverBranch: { + Node* succ = n->as_NeverBranch()->proj_out(0)->unique_ctrl_out(); + if (_succs[i]->head() == succ) { + return 1.0f; + } return 0.0f; + } case Op_TailCall: case Op_TailJump: