< prev index next >

src/share/vm/opto/graphKit.cpp

Print this page

        

*** 3588,3601 **** // (T_BYTE has the weakest alignment and size restrictions...) if (layout_is_con) { 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); 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(header_size_min <= hsize, "generic minimum is smallest"); header_size_min = hsize; header_size = intcon(hsize + round_mask); } else { Node* hss = intcon(Klass::_lh_header_size_shift); --- 3588,3601 ---- // (T_BYTE has the weakest alignment and size restrictions...) if (layout_is_con) { 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 ! 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); } else { Node* hss = intcon(Klass::_lh_header_size_shift);
*** 3717,3733 **** } } 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 initialize_value_type_array(javaoop, length, elem_klass->as_value_klass(), nargs); InitializeNode* init = alloc->initialization(); init->set_complete_with_arraycopy(); } } --- 3717,3730 ---- } } const TypeAryPtr* ary_ptr = ary_type->isa_aryptr(); ciKlass* elem_klass = ary_ptr != NULL ? ary_ptr->klass()->as_array_klass()->element_klass() : NULL; if (elem_klass != NULL && elem_klass->is_valuetype()) { ciValueKlass* vk = elem_klass->as_value_klass(); ! 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(); } }
*** 3780,3790 **** record_for_igvn(mem); set_control(loop); 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(); 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); loop->init_req(2, IfTrue(iff)); mem->init_req(2, merged_memory()); --- 3777,3787 ---- record_for_igvn(mem); set_control(loop); set_all_memory(mem); // Initialize array element Node* adr = array_element_address(array, index, T_OBJECT); ! 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); loop->init_req(2, IfTrue(iff)); mem->init_req(2, merged_memory());
*** 3796,3805 **** --- 3793,3810 ---- } // Set merged control, IO and memory 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 // the graph shapes created by the functions immediately above.
< prev index next >