< 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 >