--- old/src/share/vm/opto/callGenerator.cpp 2016-11-24 11:13:25.107592829 +0100 +++ new/src/share/vm/opto/callGenerator.cpp 2016-11-24 11:13:25.037593231 +0100 @@ -154,8 +154,10 @@ _call_node = call; // Save the call node in case we need it later if (!is_static) { if (kit.argument(0)->is_ValueType()) { - ValueTypeNode* vt = kit.argument(0)->as_ValueType(); - vt->store_to_memory(&kit); + if (!ValueTypePassFieldsAsArgs) { + ValueTypeNode* vt = kit.argument(0)->as_ValueType(); + vt->store_to_memory(&kit); + } } else { // Make an explicit receiver null_check as part of this call. // Since we share a map with the caller, his JVMS gets adjusted. @@ -369,8 +371,12 @@ call->in(0) == NULL || call->in(0)->is_top()) { return; } - - const TypeTuple *r = call->tf()->domain(); + + // FIXME: late inlining of methods that take value type arguments is + // broken: arguments at the call are set up so fields of value type + // arguments are passed but code here expects a single argument per + // value type (a ValueTypeNode) instead. + const TypeTuple *r = call->tf()->domain_sig(); for (int i1 = 0; i1 < method()->arg_size(); i1++) { if (call->in(TypeFunc::Parms + i1)->is_top() && r->field_at(TypeFunc::Parms + i1) != Type::HALF) { assert(Compile::current()->inlining_incrementally(), "shouldn't happen during parsing");