[jdk17] RFR: 8269285: Crash/miscompile in CallGenerator::for_method_handle_inline after JDK-8191998
Aleksey Shipilev
shade at openjdk.java.net
Wed Jun 30 10:04:01 UTC 2021
On Wed, 30 Jun 2021 09:45:39 GMT, Vladimir Ivanov <vlivanov at openjdk.org> wrote:
> I'm in favor of explicitly filtering out interface types coming from signatures and simply omitting casts when interface is encountered.
All right, would this be acceptable then?
--- a/src/hotspot/share/opto/callGenerator.cpp
+++ b/src/hotspot/share/opto/callGenerator.cpp
@@ -1148,9 +1148,10 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
// Cast receiver to its type.
if (!target->is_static()) {
Node* arg = kit.argument(0);
+ ciKlass* sig_klass = signature->accessing_klass();
const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
- const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass());
- if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
+ const Type* sig_type = TypeOopPtr::make_from_klass(sig_klass);
+ if (arg_type != NULL && !arg_type->higher_equal(sig_type) && !sig_klass->is_interface()) {
const Type* recv_type = arg_type->join_speculative(sig_type); // keep speculative part
Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, recv_type));
kit.set_argument(0, cast_obj);
@@ -1161,9 +1162,10 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
ciType* t = signature->type_at(i);
if (t->is_klass()) {
Node* arg = kit.argument(receiver_skip + j);
+ ciKlass* sig_klass = t->as_klass();
const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
- const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
- if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
+ const Type* sig_type = TypeOopPtr::make_from_klass(sig_klass);
+ if (arg_type != NULL && !arg_type->higher_equal(sig_type) && !sig_klass->is_interface()) {
const Type* narrowed_arg_type = arg_type->join_speculative(sig_type); // keep speculative part
Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, narrowed_arg_type));
kit.set_argument(receiver_skip + j, cast_obj);
-------------
PR: https://git.openjdk.java.net/jdk17/pull/169
More information about the hotspot-compiler-dev
mailing list