From 6ac8e24977e8dbc97e4640632c158b7f810eb6a6 Mon Sep 17 00:00:00 2001 From: Elif Aslan Date: Tue, 11 Nov 2025 23:37:00 +0000 Subject: [PATCH] Backport 7df492627b933f48750985c26de69be3f86115cb --- src/hotspot/share/opto/callGenerator.cpp | 4 + .../TestPrintInliningLateVirtualCall.java | 81 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java diff --git a/src/hotspot/share/opto/callGenerator.cpp b/src/hotspot/share/opto/callGenerator.cpp index 0579ce515f1..00008cd0410 100644 --- a/src/hotspot/share/opto/callGenerator.cpp +++ b/src/hotspot/share/opto/callGenerator.cpp @@ -554,6 +554,10 @@ bool LateInlineVirtualCallGenerator::do_late_inline_check(Compile* C, JVMState* true /*allow_intrinsics*/); if (cg != nullptr) { + if (!allow_inline && (C->print_inlining() || C->print_intrinsics())) { + C->print_inlining(method(), jvms->depth()-1, call_node()->jvms()->bci(), InliningResult::FAILURE, + "late call devirtualization"); + } assert(!cg->is_late_inline() || cg->is_mh_late_inline() || AlwaysIncrementalInline || StressIncrementalInlining, "we're doing late inlining"); _inline_cg = cg; return true; diff --git a/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java b/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java new file mode 100644 index 00000000000..b41f37b3bed --- /dev/null +++ b/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2024, Red Hat and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8327741 + * @summary JVM crash in hotspot/share/opto/compile.cpp - failed: missing inlining msg + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:-BackgroundCompilation -XX:+PrintCompilation -XX:+PrintInlining TestPrintInliningLateVirtualCall + */ + +public class TestPrintInliningLateVirtualCall { + static final A fieldA = new A(); + static final B fieldB = new B(); + static final C fieldC = new C(); + public static void main(String[] args) { + for (int i = 0; i < 20_000; i++) { + testHelper(0); + testHelper(10); + testHelper(100); + test(); + } + } + + private static void testHelper(int i) { + A a; + if (i == 10) { + a = fieldA; + } else if (i > 10) { + a = fieldB; + } else { + a = fieldC; + } + a.m(); + } + + private static void test() { + int i; + for (i = 0; i < 10; i++) { + + } + testHelper(i); + } + + static class A { + void m() { + + } + } + + static class B extends A { + void m() { + + } + } + + static class C extends A { + void m() { + + } + } +}