--- old/src/share/vm/opto/valuetypenode.cpp 2016-11-24 11:13:30.880559641 +0100 +++ new/src/share/vm/opto/valuetypenode.cpp 2016-11-24 11:13:30.813560026 +0100 @@ -29,7 +29,7 @@ #include "opto/valuetypenode.hpp" #include "opto/phaseX.hpp" -Node* ValueTypeNode::make(PhaseGVN& gvn, ciValueKlass* klass) { +ValueTypeNode* ValueTypeNode::make(PhaseGVN& gvn, ciValueKlass* klass) { // Create a new ValueTypeNode with uninitialized values and NULL oop const TypeValueType* type = TypeValueType::make(klass); return new ValueTypeNode(type, gvn.zerocon(T_VALUETYPE)); @@ -301,6 +301,44 @@ } } +uint ValueTypeNode::set_arguments_for_java_call(CallJavaNode* call, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) { + ciValueKlass* vk = get_value_klass(); + if (base_vk == NULL) { + base_vk = vk; + } + uint edges = 0; + for (uint i = 0; i < field_count(); i++) { + ciType* field_type = get_field_type(i); + int offset = base_offset + get_field_offset(i) - (base_offset > 0 ? vk->get_first_field_offset() : 0); + Node* arg = get_field_value(i); + if (field_type->is_valuetype()) { + ciValueKlass* embedded_vk = field_type->as_value_klass(); + edges += arg->as_ValueType()->set_arguments_for_java_call(call, base_input, kit, base_vk, offset); + } else { + int j = 0; int extra = 0; + for (; j < base_vk->nof_nonstatic_fields(); j++) { + ciField* f = base_vk->nonstatic_field_at(j); + if (offset == f->offset()) { + assert(f->type() == field_type, ""); + break; + } + BasicType bt = f->type()->basic_type(); + if (bt == T_LONG || bt == T_DOUBLE) { + extra++; + } + } + call->init_req(base_input + j + extra, arg); + edges++; + BasicType bt = field_type->basic_type(); + if (bt == T_LONG || bt == T_DOUBLE) { + call->init_req(base_input + j + extra + 1, kit.top()); + edges++; + } + } + } + return edges; +} + Node* ValueTypeNode::Ideal(PhaseGVN* phase, bool can_reshape) { // No optimizations for now return NULL;