< prev index next >

src/hotspot/share/opto/callGenerator.cpp

Print this page

        

*** 121,138 **** bool _separate_io_proj; public: DirectCallGenerator(ciMethod* method, bool separate_io_proj) : CallGenerator(method), _separate_io_proj(separate_io_proj) { ! // TODO fix this with the calling convention changes ! if (false /*method->signature()->return_type()->is__Value()*/) { ! // If that call has not been optimized by the time optimizations ! // are over, we'll need to add a call to create a value type ! // instance from the klass returned by the call. Separating ! // memory and I/O projections for exceptions is required to // perform that graph transformation. _separate_io_proj = true; } } virtual JVMState* generate(JVMState* jvms); --- 121,138 ---- bool _separate_io_proj; public: DirectCallGenerator(ciMethod* method, bool separate_io_proj) : CallGenerator(method), + _call_node(NULL), _separate_io_proj(separate_io_proj) { ! if (ValueTypeReturnedAsFields && method->is_method_handle_intrinsic()) { ! // If that call has not been optimized by the time optimizations are over, ! // we'll need to add a call to create a value type instance from the klass ! // returned by the call (see PhaseMacroExpand::expand_mh_intrinsic_return). ! // Separating memory and I/O projections for exceptions is required to // perform that graph transformation. _separate_io_proj = true; } } virtual JVMState* generate(JVMState* jvms);
*** 434,461 **** assert(domain_sig->cnt() - TypeFunc::Parms == nargs, "inconsistent signature"); uint j = TypeFunc::Parms; for (uint i1 = 0; i1 < nargs; i1++) { const Type* t = domain_sig->field_at(TypeFunc::Parms + i1); ! if (!ValueTypePassFieldsAsArgs) { ! Node* arg = call->in(TypeFunc::Parms + i1); ! map->set_argument(jvms, i1, arg); ! } else { ! assert(false, "FIXME"); ! // TODO move this into Parse::Parse because we might need to deopt ! /* GraphKit arg_kit(jvms, &gvn); ! if (t->is_valuetypeptr()) { ! ciValueKlass* vk = t->value_klass(); ! ValueTypeNode* vt = ValueTypeNode::make_from_multi(&arg_kit, call, vk, j, true); ! arg_kit.set_argument(i1, vt); ! j += vk->value_arg_slots(); } else { ! arg_kit.set_argument(i1, call->in(j)); j++; } ! */ } } C->print_inlining_assert_ready(); --- 434,464 ---- assert(domain_sig->cnt() - TypeFunc::Parms == nargs, "inconsistent signature"); uint j = TypeFunc::Parms; for (uint i1 = 0; i1 < nargs; i1++) { const Type* t = domain_sig->field_at(TypeFunc::Parms + i1); ! if (method()->get_Method()->has_scalarized_args()) { GraphKit arg_kit(jvms, &gvn); ! // TODO for now, don't scalarize value type receivers because of interface calls ! if (t->is_valuetypeptr() && (method()->is_static() || i1 != 0)) { ! arg_kit.set_control(map->control()); ! ValueTypeNode* vt = ValueTypeNode::make_from_multi(&arg_kit, call, t->value_klass(), j, true); ! map->set_control(arg_kit.control()); ! map->set_argument(jvms, i1, vt); } else { ! int index = j; ! SigEntry res_entry = method()->get_Method()->get_res_entry(); ! if (res_entry._offset != -1 && (index - TypeFunc::Parms) >= res_entry._offset) { ! // Skip reserved entry ! index += type2size[res_entry._bt]; ! } ! map->set_argument(jvms, i1, call->in(index)); j++; } ! } else { ! Node* arg = call->in(TypeFunc::Parms + i1); ! map->set_argument(jvms, i1, arg); } } C->print_inlining_assert_ready();
*** 500,523 **** // Handle value type returns bool returned_as_fields = call->tf()->returns_value_type_as_fields(); if (result->is_ValueType()) { ValueTypeNode* vt = result->as_ValueType(); ! if (!returned_as_fields) { ! result = ValueTypePtrNode::make_from_value_type(&kit, vt); ! } else { ! assert(false, "FIXME"); // Return of multiple values (the fields of a value type) vt->replace_call_results(&kit, call, C); ! if (gvn.type(vt->get_oop()) == TypePtr::NULL_PTR) { ! result = vt->tagged_klass(gvn); ! } else { result = vt->get_oop(); } } } else if (gvn.type(result)->is_valuetypeptr() && returned_as_fields) { - assert(false, "FIXME"); const Type* vt_t = call->_tf->range_sig()->field_at(TypeFunc::Parms); Node* cast = new CheckCastPPNode(NULL, result, vt_t); gvn.record_for_igvn(cast); ValueTypePtrNode* vtptr = ValueTypePtrNode::make_from_oop(&kit, gvn.transform(cast)); vtptr->replace_call_results(&kit, call, C); --- 503,524 ---- // Handle value type returns bool returned_as_fields = call->tf()->returns_value_type_as_fields(); if (result->is_ValueType()) { ValueTypeNode* vt = result->as_ValueType(); ! if (returned_as_fields) { // Return of multiple values (the fields of a value type) vt->replace_call_results(&kit, call, C); ! if (vt->is_allocated(&gvn) && !StressValueTypeReturnedAsFields) { result = vt->get_oop(); + } else { + result = vt->tagged_klass(gvn); } + } else { + result = ValueTypePtrNode::make_from_value_type(&kit, vt); } } else if (gvn.type(result)->is_valuetypeptr() && returned_as_fields) { const Type* vt_t = call->_tf->range_sig()->field_at(TypeFunc::Parms); Node* cast = new CheckCastPPNode(NULL, result, vt_t); gvn.record_for_igvn(cast); ValueTypePtrNode* vtptr = ValueTypePtrNode::make_from_oop(&kit, gvn.transform(cast)); vtptr->replace_call_results(&kit, call, C);
< prev index next >