< prev index next >

src/hotspot/share/opto/doCall.cpp

Print this page

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, 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.

@@ -667,10 +667,16 @@
         } else if (rt == T_OBJECT || rt == T_ARRAY) {
           assert(ct == T_OBJECT || ct == T_ARRAY || ct == T_VALUETYPE, "rt=%s, ct=%s", type2name(rt), type2name(ct));
           if (ctype->is_loaded()) {
             const TypeOopPtr* arg_type = TypeOopPtr::make_from_klass(rtype->as_klass());
             const Type*       sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
+            if (ct == T_VALUETYPE && cg->method()->get_Method()->is_returning_vt()) {
+              // A NULL ValueType cannot be returned to compiled code. The 'areturn' bytecode
+              // handler will deoptimize its caller if it is about to return a NULL ValueType.
+              // (See comments inside TypeTuple::make_range).
+              sig_type = sig_type->join_speculative(TypePtr::NOTNULL);
+            }
             if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
               Node* retnode = pop();
               Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
               if (ct == T_VALUETYPE) {
                 // We will deoptimize if the return value is null and then need to continue execution after the call
< prev index next >