--- old/src/share/vm/opto/escape.cpp 2016-12-13 09:36:29.544551712 +0100 +++ new/src/share/vm/opto/escape.cpp 2016-12-13 09:36:29.482551870 +0100 @@ -882,7 +882,7 @@ ptnode_adr(call_idx)->set_scalar_replaceable(false); } else { // Determine whether any arguments are returned. - const TypeTuple* d = call->tf()->domain(); + const TypeTuple* d = call->tf()->domain_sig(); bool ret_arg = false; for (uint i = TypeFunc::Parms; i < d->cnt(); i++) { if (d->field_at(i)->isa_ptr() != NULL && @@ -929,7 +929,7 @@ case Op_CallLeaf: { // Stub calls, objects do not escape but they are not scale replaceable. // Adjust escape state for outgoing arguments. - const TypeTuple * d = call->tf()->domain(); + const TypeTuple * d = call->tf()->domain_sig(); bool src_has_oops = false; for (uint i = TypeFunc::Parms; i < d->cnt(); i++) { const Type* at = d->field_at(i); @@ -1057,11 +1057,16 @@ // fall-through if not a Java method or no analyzer information if (call_analyzer != NULL) { PointsToNode* call_ptn = ptnode_adr(call->_idx); - const TypeTuple* d = call->tf()->domain(); + const TypeTuple* d = call->tf()->domain_sig(); + int extra = 0; for (uint i = TypeFunc::Parms; i < d->cnt(); i++) { const Type* at = d->field_at(i); + if (at->isa_valuetypeptr()) { + extra += at->is_valuetypeptr()->value_type()->value_klass()->field_count() - 1; + continue; + } int k = i - TypeFunc::Parms; - Node* arg = call->in(i); + Node* arg = call->in(i + extra); PointsToNode* arg_ptn = ptnode_adr(arg->_idx); if (at->isa_ptr() != NULL && call_analyzer->is_arg_returned(k)) { @@ -1101,7 +1106,7 @@ // Fall-through here if not a Java method or no analyzer information // or some other type of call, assume the worst case: all arguments // globally escape. - const TypeTuple* d = call->tf()->domain(); + const TypeTuple* d = call->tf()->domain_sig(); for (uint i = TypeFunc::Parms; i < d->cnt(); i++) { const Type* at = d->field_at(i); if (at->isa_oopptr() != NULL) {