From 10982fe557e9e8b68b674630a9979cb355bdbe62 Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Fri, 19 Jul 2024 07:28:51 +0000 Subject: [PATCH] 8335843: C2 hits assert(_print_inlining_stream->size() > 0) failed: missing inlining msg Reviewed-by: thartmann, kvn, vlivanov --- src/hotspot/share/opto/callGenerator.cpp | 6 +- .../print/TestPrintInliningLateMHCall.java | 79 +++++++++++++++++++ .../TestPrintInliningLateVirtualCall.java | 4 +- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/print/TestPrintInliningLateMHCall.java diff --git a/src/hotspot/share/opto/callGenerator.cpp b/src/hotspot/share/opto/callGenerator.cpp index 433d0316b9d..afd9ca25a56 100644 --- a/src/hotspot/share/opto/callGenerator.cpp +++ b/src/hotspot/share/opto/callGenerator.cpp @@ -432,6 +432,10 @@ bool LateInlineMHCallGenerator::do_late_inline_check(Compile* C, JVMState* jvms) assert(!input_not_const, "sanity"); // shouldn't have been scheduled for inlining in the first place if (cg != nullptr) { + if (!allow_inline && (C->print_inlining() || C->print_intrinsics())) { + C->print_inlining(cg->method(), jvms->depth()-1, call_node()->jvms()->bci(), InliningResult::FAILURE, + "late method handle call resolution"); + } assert(!cg->is_late_inline() || cg->is_mh_late_inline() || AlwaysIncrementalInline || StressIncrementalInlining, "we're doing late inlining"); _inline_cg = cg; C->dec_number_of_mh_late_inlines(); @@ -555,7 +559,7 @@ bool LateInlineVirtualCallGenerator::do_late_inline_check(Compile* C, JVMState* 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, + C->print_inlining(cg->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"); diff --git a/test/hotspot/jtreg/compiler/print/TestPrintInliningLateMHCall.java b/test/hotspot/jtreg/compiler/print/TestPrintInliningLateMHCall.java new file mode 100644 index 00000000000..529469e3a95 --- /dev/null +++ b/test/hotspot/jtreg/compiler/print/TestPrintInliningLateMHCall.java @@ -0,0 +1,79 @@ +/* + * 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 8335843 + * @summary C2 hits assert(_print_inlining_stream->size() > 0) failed: missing inlining msg + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:-BackgroundCompilation -XX:+PrintCompilation -XX:+PrintInlining TestPrintInliningLateMHCall + */ + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public class TestPrintInliningLateMHCall { + static final MethodHandle mh1; + static MethodHandle mh2; + + static { + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + mh1 = lookup.findStatic(TestPrintInliningLateMHCall.class, "lateResolved", MethodType.methodType(void.class)); + mh2 = mh1; + } catch (NoSuchMethodException | IllegalAccessException e) { + e.printStackTrace(); + throw new RuntimeException("Method handle lookup failed"); + } + } + + public static void main(String[] args) throws Throwable { + for (int i = 0; i < 20_000; i++) { + testHelper(0); + testHelper(10); + test(); + } + } + + private static void testHelper(int i) throws Throwable { + MethodHandle mh = null; + if (i == 10) { + mh = mh1; + } else { + mh = mh2; + } + mh.invokeExact(); + } + + private static void test() throws Throwable { + int i; + for (i = 0; i < 10; i++) { + + } + testHelper(i); + } + + private static void lateResolved() { + // noop + } +} diff --git a/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java b/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java index b41f37b3bed..f73e30badcb 100644 --- a/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java +++ b/test/hotspot/jtreg/compiler/print/TestPrintInliningLateVirtualCall.java @@ -44,9 +44,9 @@ public class TestPrintInliningLateVirtualCall { private static void testHelper(int i) { A a; if (i == 10) { - a = fieldA; - } else if (i > 10) { a = fieldB; + } else if (i > 10) { + a = fieldA; } else { a = fieldC; }