--- old/src/hotspot/share/ci/ciTypeFlow.hpp 2019-03-11 14:25:31.734355631 +0100 +++ new/src/hotspot/share/ci/ciTypeFlow.hpp 2019-03-11 14:25:31.510355634 +0100 @@ -335,14 +335,16 @@ type_at_tos()->is_array_klass(), "must be array type"); pop(); } - // pop_objArray and pop_typeArray narrow the tos to ciObjArrayKlass - // or ciTypeArrayKlass (resp.). In the rare case that an explicit + // pop_valueOrobjArray and pop_typeArray narrow the tos to ciObjArrayKlass, + // ciValueArrayKlass or ciTypeArrayKlass (resp.). In the rare case that an explicit // null is popped from the stack, we return NULL. Caller beware. - ciObjArrayKlass* pop_objArray() { + ciArrayKlass* pop_objOrValueArray() { ciType* array = pop_value(); if (array == null_type()) return NULL; - assert(array->is_obj_array_klass(), "must be object array type"); - return array->as_obj_array_klass(); + // Value type arrays may contain oop or flattened representation + assert(array->is_obj_array_klass() || (ValueArrayFlatten && array->is_value_array_klass()), + "must be value or object array type"); + return array->as_array_klass(); } ciTypeArrayKlass* pop_typeArray() { ciType* array = pop_value(); @@ -356,7 +358,7 @@ void do_null_assert(ciKlass* unloaded_klass); // Helper convenience routines. - void do_aaload(ciBytecodeStream* str); + void do_aload(ciBytecodeStream* str); void do_checkcast(ciBytecodeStream* str); void do_getfield(ciBytecodeStream* str); void do_getstatic(ciBytecodeStream* str); @@ -365,6 +367,8 @@ void do_ldc(ciBytecodeStream* str); void do_multianewarray(ciBytecodeStream* str); void do_new(ciBytecodeStream* str); + void do_defaultvalue(ciBytecodeStream* str); + void do_withfield(ciBytecodeStream* str); void do_newarray(ciBytecodeStream* str); void do_putfield(ciBytecodeStream* str); void do_putstatic(ciBytecodeStream* str); @@ -843,6 +847,8 @@ return _block_map[rpo]; } int inc_next_pre_order() { return _next_pre_order++; } + ciType* mark_as_never_null(ciType* type); + private: // A work list used during flow analysis. Block* _work_list;