From a2f99fd88bd03337e1ba73b413ffe4e39f3584cf Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Tue, 10 Jun 2025 14:19:19 +0000 Subject: [PATCH] 8354383: C2: enable sinking of Type nodes out of loop Reviewed-by: chagedorn, thartmann --- src/hotspot/share/opto/loopopts.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index 912d8452d21..ddeb5f84d49 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -1676,6 +1676,10 @@ bool PhaseIdealLoop::safe_for_if_replacement(const Node* dom) const { // like various versions of induction variable+offset. Clone the // computation per usage to allow it to sink out of the loop. void PhaseIdealLoop::try_sink_out_of_loop(Node* n) { + bool is_raw_to_oop_cast = n->is_ConstraintCast() && + n->in(1)->bottom_type()->isa_rawptr() && + !n->bottom_type()->isa_rawptr(); + if (has_ctrl(n) && !n->is_Phi() && !n->is_Bool() && @@ -1685,7 +1689,9 @@ void PhaseIdealLoop::try_sink_out_of_loop(Node* n) { !n->is_OpaqueNotNull() && !n->is_OpaqueInitializedAssertionPredicate() && !n->is_OpaqueTemplateAssertionPredicate() && - !n->is_Type()) { + !is_raw_to_oop_cast && // don't extend live ranges of raw oops + (KillPathsReachableByDeadTypeNode || !n->is_Type()) + ) { Node *n_ctrl = get_ctrl(n); IdealLoopTree *n_loop = get_loop(n_ctrl);