From 776e1cf1dfefd7cb1a0190ab71f71ad5ff25d0e4 Mon Sep 17 00:00:00 2001 From: Dean Long Date: Wed, 9 Apr 2025 20:06:49 +0000 Subject: [PATCH] 8353041: NeverBranchNode causes incorrect block frequency calculation Reviewed-by: thartmann, rcastanedalo --- src/hotspot/share/opto/domgraph.cpp | 14 +++++++++++++- src/hotspot/share/opto/gcm.cpp | 7 ++++++- 2 files changed, 19 insertions(+), 2 deletions(-) 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: