# HG changeset patch # User Tom Rodriguez # Date 1442937070 25200 # Node ID a7114a5e69e11057d3522fcb277b1c7800c19cf2 # Parent ed53e370f04cfc356f3eb77774361eb9e47195d7 Don't expect internal fields when rematerializing object for C2 methods diff -r ed53e370f04c -r a7114a5e69e1 src/share/vm/jvmci/jvmciCompilerToVM.cpp --- a/src/share/vm/jvmci/jvmciCompilerToVM.cpp Tue Sep 22 17:28:53 2015 +0200 +++ b/src/share/vm/jvmci/jvmciCompilerToVM.cpp Tue Sep 22 08:51:10 2015 -0700 @@ -927,7 +927,7 @@ bool reallocated = false; if (objects != NULL) { reallocated = Deoptimization::realloc_objects(thread, fst.current(), objects, THREAD); - Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, reallocated); + Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, reallocated, false); GrowableArray* local_values = cvf->scope()->locals(); typeArrayHandle array = oopFactory::new_boolArray(local_values->length(), thread); @@ -1082,7 +1082,7 @@ } bool reallocated = Deoptimization::realloc_objects(thread, fst.current(), objects, THREAD); - Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, reallocated); + Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, reallocated, false); for (int frame_index = 0; frame_index < virtualFrames->length(); frame_index++) { compiledVFrame* cvf = virtualFrames->at(frame_index); diff -r ed53e370f04c -r a7114a5e69e1 src/share/vm/runtime/deoptimization.cpp --- a/src/share/vm/runtime/deoptimization.cpp Tue Sep 22 17:28:53 2015 +0200 +++ b/src/share/vm/runtime/deoptimization.cpp Tue Sep 22 08:51:10 2015 -0700 @@ -205,6 +205,7 @@ // Set the deoptee nmethod assert(thread->deopt_nmethod() == NULL, "Pending deopt!"); thread->set_deopt_nmethod(deoptee.cb()->as_nmethod_or_null()); + bool skip_internal = thread->deopt_nmethod() != NULL && !thread->deopt_nmethod()->compiler()->is_jvmci(); if (VerifyStack) { thread->validate_frame_layout(); @@ -261,7 +262,7 @@ JRT_BLOCK realloc_failures = realloc_objects(thread, &deoptee, objects, THREAD); JRT_END - reassign_fields(&deoptee, &map, objects, realloc_failures); + reassign_fields(&deoptee, &map, objects, realloc_failures, skip_internal); #ifndef PRODUCT if (TraceDeoptimization) { ttyLocker ttyl; @@ -935,14 +936,14 @@ // Restore fields of an eliminated instance object using the same field order // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true) -static int reassign_fields_by_klass(InstanceKlass* klass, frame* fr, RegisterMap* reg_map, ObjectValue* sv, int svIndex, oop obj) { +static int reassign_fields_by_klass(InstanceKlass* klass, frame* fr, RegisterMap* reg_map, ObjectValue* sv, int svIndex, oop obj, bool skip_internal) { if (klass->superklass() != NULL) { - svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj); + svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal); } GrowableArray* fields = new GrowableArray(); for (AllFieldStream fs(klass); !fs.done(); fs.next()) { - if (!fs.access_flags().is_static()) { + if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) { ReassignedField field; field._offset = fs.offset(); field._type = FieldType::basic_type(fs.signature()); @@ -1031,7 +1032,7 @@ } // restore fields of all eliminated objects and arrays -void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures) { +void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures, bool skip_internal) { for (int i = 0; i < objects->length(); i++) { ObjectValue* sv = (ObjectValue*) objects->at(i); KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); @@ -1046,7 +1047,7 @@ if (k->oop_is_instance()) { InstanceKlass* ik = InstanceKlass::cast(k()); - reassign_fields_by_klass(ik, fr, reg_map, sv, 0, obj()); + reassign_fields_by_klass(ik, fr, reg_map, sv, 0, obj(), skip_internal); } else if (k->oop_is_typeArray()) { TypeArrayKlass* ak = TypeArrayKlass::cast(k()); reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type()); diff -r ed53e370f04c -r a7114a5e69e1 src/share/vm/runtime/deoptimization.hpp --- a/src/share/vm/runtime/deoptimization.hpp Tue Sep 22 17:28:53 2015 +0200 +++ b/src/share/vm/runtime/deoptimization.hpp Tue Sep 22 08:51:10 2015 -0700 @@ -145,7 +145,7 @@ static bool realloc_objects(JavaThread* thread, frame* fr, GrowableArray* objects, TRAPS); static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type); static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj); - static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures); + static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures, bool skip_internal); static void relock_objects(GrowableArray* monitors, JavaThread* thread, bool realloc_failures); static void pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array); NOT_PRODUCT(static void print_objects(GrowableArray* objects, bool realloc_failures);)