< 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 >