--- old/src/share/vm/opto/graphKit.cpp 2017-02-13 17:39:01.703392558 +0100 +++ new/src/share/vm/opto/graphKit.cpp 2017-02-13 17:39:01.635392561 +0100 @@ -3590,10 +3590,10 @@ int hsize = Klass::layout_helper_header_size(layout_con); int eshift = Klass::layout_helper_log2_element_size(layout_con); BasicType etype = Klass::layout_helper_element_type(layout_con); + bool is_value_array = Klass::layout_helper_is_valueArray(layout_con); if ((round_mask & ~right_n_bits(eshift)) == 0) round_mask = 0; // strength-reduce it if it goes away completely - // TODO re-enabled assert - // assert((hsize & right_n_bits(eshift)) == 0, "hsize is pre-rounded"); + assert(is_value_array || (hsize & right_n_bits(eshift)) == 0, "hsize is pre-rounded"); assert(header_size_min <= hsize, "generic minimum is smallest"); header_size_min = hsize; header_size = intcon(hsize + round_mask); @@ -3719,13 +3719,10 @@ const TypeAryPtr* ary_ptr = ary_type->isa_aryptr(); ciKlass* elem_klass = ary_ptr != NULL ? ary_ptr->klass()->as_array_klass()->element_klass() : NULL; - //if (layout_is_con && Klass::layout_helper_element_type(layout_con) == T_VALUETYPE) { if (elem_klass != NULL && elem_klass->is_valuetype()) { ciValueKlass* vk = elem_klass->as_value_klass(); - if (vk->flatten_array()) { - // TODO - } else { - // TODO explain this and add asserts + if (!vk->flatten_array()) { + // Non-flattened value type arrays need to be initialized with default value type oops initialize_value_type_array(javaoop, length, elem_klass->as_value_klass(), nargs); InitializeNode* init = alloc->initialization(); init->set_complete_with_arraycopy(); @@ -3782,7 +3779,7 @@ set_all_memory(mem); // Initialize array element Node* adr = array_element_address(array, index, T_OBJECT); - const TypeOopPtr* elemtype = TypeValueTypePtr::make(TypePtr::NotNull, vk); // ary_type->is_aryptr()->elem()->make_oopptr(); + const TypeOopPtr* elemtype = TypeValueTypePtr::make(TypePtr::NotNull, vk); Node* store = store_oop_to_array(control(), array, adr, TypeAryPtr::OOPS, oop, elemtype, T_OBJECT, MemNode::release); IfNode* iff = create_and_map_if(control(), Bool(CmpI(index, length), BoolTest::lt), PROB_FAIR, COUNT_UNKNOWN); @@ -3798,6 +3795,14 @@ set_control(res_ctl); set_i_o(res_io); merge_memory(loop_map->merged_memory(), res_ctl, 2); + + // Transform new memory Phis. + for (MergeMemStream mms(merged_memory()); mms.next_non_empty();) { + Node* phi = mms.memory(); + if (phi->is_Phi() && phi->in(0) == res_ctl) { + mms.set_memory(gvn().transform(phi)); + } + } } // The following "Ideal_foo" functions are placed here because they recognize