diff --git a/src/hotspot/share/ci/ciMethod.cpp b/src/hotspot/share/ci/ciMethod.cpp index aac2a553cda..844ef0a0c03 100644 --- a/src/hotspot/share/ci/ciMethod.cpp +++ b/src/hotspot/share/ci/ciMethod.cpp @@ -718,17 +718,10 @@ ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller, { MutexLocker locker(Compile_lock); InstanceKlass* context = actual_recv->get_instanceKlass(); - if (UseVtableBasedCHA) { - target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, - root_m->get_Method(), - callee_holder->get_Klass(), - this->get_Method())); - } else { - if (root_m->is_abstract()) { - return nullptr; // not supported - } - target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, root_m->get_Method())); - } + target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, + root_m->get_Method(), + callee_holder->get_Klass(), + this->get_Method())); assert(target() == nullptr || !target()->is_abstract(), "not allowed"); // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods. } diff --git a/src/hotspot/share/code/dependencies.cpp b/src/hotspot/share/code/dependencies.cpp index 26e53ed9027..7d3b744313f 100644 --- a/src/hotspot/share/code/dependencies.cpp +++ b/src/hotspot/share/code/dependencies.cpp @@ -113,11 +113,7 @@ void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm) void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm, ciKlass* resolved_klass, ciMethod* resolved_method) { check_ctxk(ctxk); check_unique_method(ctxk, uniqm); - if (UseVtableBasedCHA) { - assert_common_4(unique_concrete_method_4, ctxk, uniqm, resolved_klass, resolved_method); - } else { - assert_common_2(unique_concrete_method_2, ctxk, uniqm); - } + assert_common_4(unique_concrete_method_4, ctxk, uniqm, resolved_klass, resolved_method); } void Dependencies::assert_unique_implementor(ciInstanceKlass* ctxk, ciInstanceKlass* uniqk) { @@ -1474,7 +1470,6 @@ class LinkedConcreteMethodFinder : public AbstractClassHierarchyWalker { // Optionally, a method which was previously determined as a unique target (uniqm) is added as a participant // to enable dependency spot-checking and speed up the search. LinkedConcreteMethodFinder(InstanceKlass* resolved_klass, Method* resolved_method, Method* uniqm = nullptr) : AbstractClassHierarchyWalker(nullptr) { - assert(UseVtableBasedCHA, "required"); assert(resolved_klass->is_linked(), "required"); assert(resolved_method->method_holder()->is_linked(), "required"); assert(!resolved_method->can_be_statically_bound(), "no vtable index available"); @@ -1948,7 +1943,6 @@ Klass* Dependencies::check_unique_concrete_method(InstanceKlass* ctxk, Klass* resolved_klass, Method* resolved_method, KlassDepChange* changes) { - assert(UseVtableBasedCHA, "required"); assert(!ctxk->is_interface() || ctxk == resolved_klass, "sanity"); assert(!resolved_method->can_be_statically_bound() || resolved_method == uniqm, "sanity"); assert(resolved_klass->is_subtype_of(resolved_method->method_holder()), "sanity"); @@ -2129,7 +2123,7 @@ Klass* Dependencies::DepStream::check_klass_dependency(KlassDepChange* changes) Dependencies::check_valid_dependency_type(type()); if (changes != nullptr) { - if (UseVtableBasedCHA && changes->is_klass_init_change()) { + if (changes->is_klass_init_change()) { return check_klass_init_dependency(changes->as_klass_init_change()); } else { return check_new_klass_dependency(changes->as_new_klass_change()); diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index aa8f47f62df..9c40bc1cee8 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -929,7 +929,7 @@ bool InstanceKlass::link_class_impl(TRAPS) { // In case itable verification is ever added. // itable().verify(tty, true); #endif - if (UseVtableBasedCHA && Universe::is_fully_initialized()) { + if (Universe::is_fully_initialized()) { DeoptimizationScope deopt_scope; { // Now mark all code that assumes the class is not linked. @@ -1264,7 +1264,7 @@ void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) // Update hierarchy. This is done before the new klass has been added to the SystemDictionary. The Compile_lock // is grabbed, to ensure that the compiler is not using the class hierarchy. -void InstanceKlass::add_to_hierarchy_impl(JavaThread* current) { +void InstanceKlass::add_to_hierarchy(JavaThread* current) { assert(!SafepointSynchronize::is_at_safepoint(), "must NOT be at safepoint"); DeoptimizationScope deopt_scope; @@ -1290,23 +1290,6 @@ void InstanceKlass::add_to_hierarchy_impl(JavaThread* current) { deopt_scope.deoptimize_marked(); } -void InstanceKlass::add_to_hierarchy(JavaThread* current) { - - if (UseVtableBasedCHA || !Universe::is_fully_initialized()) { - add_to_hierarchy_impl(current); - } else { - // In case we are not using CHA based vtables we need to make sure the loaded - // deopt is completed before anyone links this class. - // Linking is done with init_lock held, by loading and deopting with it - // held we make sure the deopt is completed before linking. - Handle h_init_lock(current, init_lock()); - ObjectLocker ol(h_init_lock, current); - add_to_hierarchy_impl(current); - - // This doesn't need a notify because the wait is only on the class initialization path. - } -} - InstanceKlass* InstanceKlass::implementor() const { InstanceKlass* volatile* ik = adr_implementor(); diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index fe281f95148..6e5d4ac8e7f 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -828,9 +828,6 @@ public: void set_jni_ids(JNIid* ids) { _jni_ids = ids; } JNIid* jni_id_for(int offset); - private: - void add_to_hierarchy_impl(JavaThread* current); - public: // maintenance of deoptimization dependencies inline DependencyContext dependencies(); diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index f428403fa30..d353c5a162a 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -522,6 +522,7 @@ static SpecialFlag const special_jvm_flags[] = { #endif // X86 { "HeapFirstMaximumCompactionCount", JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) }, + { "UseVtableBasedCHA", JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) }, #ifdef ASSERT { "DummyObsoleteTestFlag", JDK_Version::undefined(), JDK_Version::jdk(18), JDK_Version::undefined() }, #endif diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index e4eb8d3e9e9..468e9bd8800 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -968,9 +968,6 @@ const int ObjectAlignmentInBytes = 8; develop(bool, UseCHA, true, \ "Enable CHA") \ \ - product(bool, UseVtableBasedCHA, true, DIAGNOSTIC, \ - "Use vtable information during CHA") \ - \ product(bool, UseTypeProfile, true, \ "Check interpreter profile for historically monomorphic calls") \ \ diff --git a/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java b/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java index 57f41dece80..6f173fefe1e 100644 --- a/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java +++ b/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java @@ -23,7 +23,7 @@ /* * @test - * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true + * @requires !vm.graal.enabled * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.base/jdk.internal.vm.annotation diff --git a/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java b/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java index ee2dda744e6..1b72399069e 100644 --- a/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java +++ b/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java @@ -23,7 +23,7 @@ /* * @test - * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true + * @requires !vm.graal.enabled * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.base/jdk.internal.vm.annotation diff --git a/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java b/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java index 736fa242bdc..068da4100bd 100644 --- a/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java +++ b/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java @@ -23,7 +23,7 @@ /* * @test - * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true + * @requires !vm.graal.enabled * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.base/jdk.internal.vm.annotation diff --git a/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java b/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java deleted file mode 100644 index 415cd105ee9..00000000000 --- a/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle 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 id=special - * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA) - * @requires vm.flagless - * @library /test/lib - * @modules java.base/jdk.internal.org.objectweb.asm - * java.base/jdk.internal.misc - * @compile invokespecial/Checker.java invokespecial/ClassGenerator.java invokespecial/Generator.java - * - * @run driver/timeout=1800 invocationOldCHATests special - */ - -/* - * @test id=virtual - * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA) - * @requires vm.flagless - * @library /test/lib - * @modules java.base/jdk.internal.org.objectweb.asm - * java.base/jdk.internal.misc - * @compile invokevirtual/Checker.java invokevirtual/ClassGenerator.java invokevirtual/Generator.java - * - * @run driver/timeout=1800 invocationOldCHATests virtual - */ - -/* - * @test id=interface - * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA) - * @requires vm.flagless - * @library /test/lib - * @modules java.base/jdk.internal.org.objectweb.asm - * java.base/jdk.internal.misc - * @compile invokeinterface/Checker.java invokeinterface/ClassGenerator.java invokeinterface/Generator.java - * - * @run driver/timeout=1800 invocationOldCHATests interface - */ - -import jdk.test.lib.process.ProcessTools; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.compiler.InMemoryJavaCompiler; - -public class invocationOldCHATests { - - public static void runTest(String whichTests, String classFileVersion) throws Throwable { - System.out.println("\nOld CHA invocation tests, Tests: " + whichTests + - ", class file version: " + classFileVersion); - ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-Xmx128M", - "-Xcomp", "-XX:+UnlockDiagnosticVMOptions", "-XX:-UseVtableBasedCHA", - "--add-exports", "java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED", - whichTests, "--classfile_version=" + classFileVersion); - OutputAnalyzer output = new OutputAnalyzer(pb.start()); - try { - output.shouldContain("EXECUTION STATUS: PASSED"); - output.shouldHaveExitValue(0); - } catch (Throwable e) { - System.out.println( - "\nNote that an entry such as 'B.m/C.m' in the failure chart means that" + - " the test case failed because method B.m was invoked but the test " + - "expected method C.m to be invoked. Similarly, a result such as 'AME/C.m'" + - " means that an AbstractMethodError exception was thrown but the test" + - " case expected method C.m to be invoked."); - System.out.println( - "\nAlso note that passing --dump to invoke*.Generator will" + - " dump the generated classes (for debugging purposes).\n"); - - throw e; - } - } - - public static void main(String args[]) throws Throwable { - if (args.length < 1) { - throw new IllegalArgumentException("Should provide the test name"); - } - String testName = args[0]; - - // Get current major class file version and test with it. - byte klassbuf[] = InMemoryJavaCompiler.compile("blah", "public class blah { }"); - int major_version = klassbuf[6] << 8 | klassbuf[7]; - - switch (testName) { - case "special": - runTest("invokespecial.Generator", String.valueOf(major_version)); - break; - case "virtual": - runTest("invokevirtual.Generator", String.valueOf(major_version)); - break; - case "interface": - runTest("invokeinterface.Generator", String.valueOf(major_version)); - break; - default: - throw new IllegalArgumentException("Unknown test name: " + testName); - } - } -} diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java index e37646ac6d1..49cc6e14311 100644 --- a/test/jtreg-ext/requires/VMProps.java +++ b/test/jtreg-ext/requires/VMProps.java @@ -386,7 +386,6 @@ public class VMProps implements Callable> { vmOptFinalFlag(map, "EliminateAllocations"); vmOptFinalFlag(map, "UseCompressedOops"); vmOptFinalFlag(map, "UseVectorizedMismatchIntrinsic"); - vmOptFinalFlag(map, "UseVtableBasedCHA"); vmOptFinalFlag(map, "ZGenerational"); }