< prev index next >

src/hotspot/share/opto/doCall.cpp

Print this page

*** 1,7 **** /* ! * Copyright (c) 1998, 2016, 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. --- 1,7 ---- /* ! * 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,676 **** --- 667,682 ---- } 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 >