--- old/src/share/vm/opto/compile.cpp 2016-11-16 09:06:11.926498574 +0100 +++ new/src/share/vm/opto/compile.cpp 2016-11-16 09:06:11.854498572 +0100 @@ -1757,8 +1757,9 @@ // Check for final fields. const TypeInstPtr* tinst = flat->isa_instptr(); + const TypeValueTypePtr* vtptr = flat->isa_valuetypeptr(); + ciField* field = NULL; if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) { - ciField* field; if (tinst->const_oop() != NULL && tinst->klass() == ciEnv::current()->Class_klass() && tinst->offset() >= (tinst->klass()->as_instance_klass()->size_helper() * wordSize)) { @@ -1769,14 +1770,18 @@ ciInstanceKlass *k = tinst->klass()->as_instance_klass(); field = k->get_field_by_offset(tinst->offset(), false); } - assert(field == NULL || - original_field == NULL || - (field->holder() == original_field->holder() && - field->offset() == original_field->offset() && - field->is_static() == original_field->is_static()), "wrong field?"); - // Set field() and is_rewritable() attributes. - if (field != NULL) alias_type(idx)->set_field(field); + } else if (vtptr) { + // Value type field + ciValueKlass* vk = vtptr->klass()->as_value_klass(); + field = vk->get_field_by_offset(vtptr->offset(), false); } + assert(field == NULL || + original_field == NULL || + (field->holder() == original_field->holder() && + field->offset() == original_field->offset() && + field->is_static() == original_field->is_static()), "wrong field?"); + // Set field() and is_rewritable() attributes. + if (field != NULL) alias_type(idx)->set_field(field); } // Fill the cache for next time.