[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