--- old/src/share/vm/opto/callGenerator.cpp 2017-08-04 21:18:19.951444028 +0200 +++ new/src/share/vm/opto/callGenerator.cpp 2017-08-04 21:18:12.769456082 +0200 @@ -495,6 +495,7 @@ C->set_inlining_progress(true); if (return_type->is_valuetype()) { + const Type* vt_t = call->_tf->range_sig()->field_at(TypeFunc::Parms); if (result->is_ValueType()) { ValueTypeNode* vt = result->as_ValueType(); if (!call->tf()->returns_value_type_as_fields()) { @@ -503,14 +504,20 @@ } else { // Return of multiple values (the fields of a value type) vt->replace_call_results(call, C); + if (gvn.type(vt->get_oop()) == TypePtr::NULL_PTR) { + result = vt->tagged_klass(gvn); + } else { + result = vt->get_oop(); + } } } else { - const Type* vt_t = call->_tf->range_sig()->field_at(TypeFunc::Parms); if (vt_t->is_valuetypeptr()->value_type()->value_klass() != C->env()->___Value_klass()) { if (gvn.type(result)->isa_valuetypeptr() && call->tf()->returns_value_type_as_fields()) { - Node* cast = gvn.transform(new CheckCastPPNode(NULL, result, vt_t)); - ValueTypePtrNode* vtptr = ValueTypePtrNode::make(gvn, kit.merged_memory(), cast); + Node* cast = new CheckCastPPNode(NULL, result, vt_t); + gvn.record_for_igvn(cast); + ValueTypePtrNode* vtptr = ValueTypePtrNode::make(gvn, kit.merged_memory(), gvn.transform(cast)); vtptr->replace_call_results(call, C); + result = cast; } else { assert(result->is_top(), "what else?"); for (DUIterator_Fast imax, i = call->fast_outs(imax); i < imax; i++) {