--- old/src/share/vm/opto/type.cpp 2017-07-04 18:39:47.694149970 +0200 +++ new/src/share/vm/opto/type.cpp 2017-07-04 18:39:47.619150316 +0200 @@ -1928,46 +1928,13 @@ } } -// Can a value type instance of this type be returned as multiple -// returned values? -static bool vt_can_be_returned_as_fields(ciValueKlass* vk) { - if (vk == ciEnv::current()->___Value_klass()) { - return false; - } - - ResourceMark rm; - uint args = vk->value_arg_slots() + 1 /* return vk as well */; - - BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, args); - VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, args); - - sig_bt[0] = T_METADATA; - for (uint i = 0, j = 1; i < (uint)vk->nof_nonstatic_fields(); i++) { - BasicType bt = vk->nonstatic_field_at(i)->layout_type(); - assert(i+j < args, "out of bounds access"); - sig_bt[i+j] = bt; - if (bt == T_LONG || bt == T_DOUBLE) { - j++; - assert(i+j < args, "out of bounds access"); - sig_bt[i+j] = T_VOID; - } - } - - if (SharedRuntime::java_return_convention(sig_bt, regs, args) <= 0) { - return false; - } - - return true; -} - - //------------------------------make------------------------------------------- // Make a TypeTuple from the range of a method signature const TypeTuple *TypeTuple::make_range(ciSignature* sig, bool ret_vt_fields) { ciType* return_type = sig->return_type(); uint arg_cnt = 0; if (ret_vt_fields) { - ret_vt_fields = return_type->is_valuetype() && vt_can_be_returned_as_fields((ciValueKlass*)return_type); + ret_vt_fields = return_type->is_valuetype() && ((ciValueKlass*)return_type)->can_be_returned_as_fields(); } if (ret_vt_fields) { ciValueKlass* vk = (ciValueKlass*)return_type;