Skip to content

Commit 4cc9d7a

Browse files
author
duke
committedNov 6, 2023
Automatic merge of jdk:master into master
2 parents e8ec631 + b5c863b commit 4cc9d7a

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed
 

‎src/hotspot/share/opto/subtypenode.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ const Type* SubTypeCheckNode::sub(const Type* sub_t, const Type* super_t) const
4343
if (!superklass->is_interface() && superklass->is_abstract() &&
4444
!superklass->as_instance_klass()->has_subklass()) {
4545
Compile::current()->dependencies()->assert_leaf_type(superklass);
46+
if (subk->is_same_java_type_as(superk) && !sub_t->maybe_null()) {
47+
// The super_t has no subclasses, and sub_t has the same type and is not null,
48+
// hence the check should always evaluate to EQ. However, this is an impossible
49+
// situation since super_t is also abstract, and hence sub_t cannot have the
50+
// same type and be non-null.
51+
// Still, if the non-static method of an abstract class without subclasses is
52+
// force-compiled, the Param0 has the self/this pointer with NotNull. This
53+
// method would now never be called, because of the leaf-type dependency. Hence,
54+
// just for consistency with verification, we return EQ.
55+
return TypeInt::CC_EQ;
56+
}
57+
// subk is either a supertype of superk, or null. In either case, superk is a subtype.
4658
return TypeInt::CC_GT;
4759
}
4860
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
26+
/**
27+
* @test
28+
* @bug 8316533
29+
* @summary Oop of abstract class A with no subclass is subtype checked after null-check
30+
* @run driver compiler.types.TestSubTypeOfAbstractClass
31+
*/
32+
33+
/**
34+
* @test
35+
* @bug 8316533
36+
* @summary Oop of abstract class A is subtype checked after null-check
37+
* @requires vm.compiler2.enabled
38+
* @run main/othervm -XX:CompileCommand=compileonly,*A::test
39+
* -Xcomp -XX:+IgnoreUnrecognizedVMOptions -XX:+StressReflectiveCode
40+
* compiler.types.TestSubTypeOfAbstractClass
41+
*/
42+
43+
package compiler.types;
44+
45+
public class TestSubTypeOfAbstractClass {
46+
47+
abstract class A {
48+
public static A get_null() {
49+
return null;
50+
}
51+
52+
public static boolean test() {
53+
// NullCheck -> CastPP with type A:NotNull
54+
// But A is abstract with no subclass, hence this type is impossible
55+
return get_null() instanceof A;
56+
}
57+
}
58+
59+
public static void main(String[] args) {
60+
for (int i = 0; i < 10_000; i++ ) {
61+
A.test();
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)
Failed to load comments.