< prev index next >

src/hotspot/share/opto/parse2.cpp

Print this page

        

*** 79,113 **** (!elemptr->is_valuetypeptr() || elemptr->value_klass()->flatten_array()), "array can't be flattened"); Node* ctl = control(); IdealKit ideal(this); IdealVariable res(ideal); ideal.declarations_done(); ! Node* kls = load_object_klass(ary); ! Node* tag = load_lh_array_tag(kls); ! ideal.if_then(tag, BoolTest::ne, intcon(Klass::_lh_array_tag_vt_value)); { ! // non-flattened ! sync_kit(ideal); ! const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(bt); ! Node* ld = access_load_at(ary, adr, adr_type, elemptr, bt, ! IN_HEAP | IS_ARRAY | C2_CONTROL_DEPENDENT_LOAD, ctl); ! ideal.sync_kit(this); ! ideal.set(res, ld); ! } ideal.else_(); { // flattened sync_kit(ideal); if (elemptr->is_valuetypeptr()) { // Element type is known, cast and load from flattened representation ciValueKlass* vk = elemptr->value_klass(); assert(vk->flatten_array() && elemptr->maybe_null(), "must be a flattenable and nullable array"); ciArrayKlass* array_klass = ciArrayKlass::make(vk, /* never_null */ true); const TypeAryPtr* arytype = TypeOopPtr::make_from_klass(array_klass)->isa_aryptr(); Node* cast = _gvn.transform(new CheckCastPPNode(control(), ary, arytype)); ! adr = array_element_address(cast, idx, T_VALUETYPE, ary_t->size(), control()); ! Node* vt = ValueTypeNode::make_from_flattened(this, vk, cast, adr)->allocate(this, false, false)->get_oop(); ideal.set(res, vt); ideal.sync_kit(this); } else { // Element type is unknown, emit runtime call Node* k_adr = basic_plus_adr(kls, in_bytes(ArrayKlass::element_klass_offset())); Node* elem_klass = _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS)); Node* obj_size = NULL; kill_dead_locals(); --- 79,105 ---- (!elemptr->is_valuetypeptr() || elemptr->value_klass()->flatten_array()), "array can't be flattened"); Node* ctl = control(); IdealKit ideal(this); IdealVariable res(ideal); ideal.declarations_done(); ! Node* flattened = gen_flattened_array_test(ary); ! ideal.if_then(flattened, BoolTest::ne, zerocon(flattened->bottom_type()->basic_type())); { // flattened sync_kit(ideal); if (elemptr->is_valuetypeptr()) { // Element type is known, cast and load from flattened representation ciValueKlass* vk = elemptr->value_klass(); assert(vk->flatten_array() && elemptr->maybe_null(), "must be a flattenable and nullable array"); ciArrayKlass* array_klass = ciArrayKlass::make(vk, /* never_null */ true); const TypeAryPtr* arytype = TypeOopPtr::make_from_klass(array_klass)->isa_aryptr(); Node* cast = _gvn.transform(new CheckCastPPNode(control(), ary, arytype)); ! Node* casted_adr = array_element_address(cast, idx, T_VALUETYPE, ary_t->size(), control()); ! Node* vt = ValueTypeNode::make_from_flattened(this, vk, cast, casted_adr)->allocate(this, false, false)->get_oop(); ideal.set(res, vt); ideal.sync_kit(this); } else { + Node* kls = load_object_klass(ary); // Element type is unknown, emit runtime call Node* k_adr = basic_plus_adr(kls, in_bytes(ArrayKlass::element_klass_offset())); Node* elem_klass = _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS)); Node* obj_size = NULL; kill_dead_locals();
*** 164,177 **** --- 156,181 ---- // fully initialized alloc_obj = new CastPPNode(alloc_obj, _gvn.type(alloc_obj), true); alloc_obj->set_req(0, control()); alloc_obj = _gvn.transform(alloc_obj); + const Type* unknown_value = TypeInstPtr::BOTTOM->cast_to_flatten_array(); + + alloc_obj = _gvn.transform(new CheckCastPPNode(control(), alloc_obj, unknown_value)); + ideal.sync_kit(this); ideal.set(res, alloc_obj); } + } ideal.else_(); { + // non-flattened + sync_kit(ideal); + const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(bt); + Node* ld = access_load_at(ary, adr, adr_type, elemptr, bt, + IN_HEAP | IS_ARRAY | C2_CONTROL_DEPENDENT_LOAD, ctl); + ideal.sync_kit(this); + ideal.set(res, ld); } ideal.end_if(); sync_kit(ideal); push_node(bt, _gvn.transform(ideal.value(res))); return; }
*** 267,294 **** } else if (!ary_t->is_not_flat()) { // Array might be flattened, emit runtime checks assert(ValueArrayFlatten && !not_flattenable && elemtype->is_oopptr()->can_be_value_type() && !ary_t->klass_is_exact() && !ary_t->is_not_null_free(), "array can't be flattened"); IdealKit ideal(this); ! Node* kls = load_object_klass(ary); ! Node* layout_val = load_lh_array_tag(kls); ! ideal.if_then(layout_val, BoolTest::ne, intcon(Klass::_lh_array_tag_vt_value)); ! { ! // non-flattened ! sync_kit(ideal); ! gen_value_array_null_guard(ary, cast_val, 3); ! access_store_at(ary, adr, adr_type, cast_val, elemtype, bt, MO_UNORDERED | IN_HEAP | IS_ARRAY, false, false); ! ideal.sync_kit(this); ! } ! ideal.else_(); ! { // flattened ! if (!cast_val->is_ValueType() && tval->maybe_null()) { // Add null check sync_kit(ideal); Node* null_ctl = top(); ! cast_val = null_check_oop(cast_val, &null_ctl); if (null_ctl != top()) { PreserveJVMState pjvms(this); inc_sp(3); set_control(null_ctl); uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none); --- 271,289 ---- } else if (!ary_t->is_not_flat()) { // Array might be flattened, emit runtime checks assert(ValueArrayFlatten && !not_flattenable && elemtype->is_oopptr()->can_be_value_type() && !ary_t->klass_is_exact() && !ary_t->is_not_null_free(), "array can't be flattened"); IdealKit ideal(this); ! Node* flattened = gen_flattened_array_test(ary); ! ideal.if_then(flattened, BoolTest::ne, zerocon(flattened->bottom_type()->basic_type())); { ! Node* val = cast_val; // flattened ! if (!val->is_ValueType() && tval->maybe_null()) { // Add null check sync_kit(ideal); Node* null_ctl = top(); ! val = null_check_oop(val, &null_ctl); if (null_ctl != top()) { PreserveJVMState pjvms(this); inc_sp(3); set_control(null_ctl); uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
*** 303,325 **** } else if (tval_init->isa_valuetype() || tval_init->is_valuetypeptr()) { vk = tval_init->value_klass(); } else if (elemtype->is_valuetypeptr()) { vk = elemtype->value_klass(); } if (vk != NULL && !stopped()) { // Element type is known, cast and store to flattened representation sync_kit(ideal); assert(vk->flatten_array() && elemtype->maybe_null(), "must be a flattenable and nullable array"); ciArrayKlass* array_klass = ciArrayKlass::make(vk, /* never_null */ true); const TypeAryPtr* arytype = TypeOopPtr::make_from_klass(array_klass)->isa_aryptr(); ! ary = _gvn.transform(new CheckCastPPNode(control(), ary, arytype)); ! adr = array_element_address(ary, idx, T_OBJECT, arytype->size(), control()); ! if (!cast_val->is_ValueType()) { ! assert(!gvn().type(cast_val)->maybe_null(), "value type array elements should never be null"); ! cast_val = ValueTypeNode::make_from_oop(this, cast_val, vk); } ! cast_val->as_ValueType()->store_flattened(this, ary, adr); ideal.sync_kit(this); } else if (!ideal.ctrl()->is_top()) { // Element type is unknown, emit runtime call sync_kit(ideal); --- 298,321 ---- } else if (tval_init->isa_valuetype() || tval_init->is_valuetypeptr()) { vk = tval_init->value_klass(); } else if (elemtype->is_valuetypeptr()) { vk = elemtype->value_klass(); } + Node* casted_ary = ary; if (vk != NULL && !stopped()) { // Element type is known, cast and store to flattened representation sync_kit(ideal); assert(vk->flatten_array() && elemtype->maybe_null(), "must be a flattenable and nullable array"); ciArrayKlass* array_klass = ciArrayKlass::make(vk, /* never_null */ true); const TypeAryPtr* arytype = TypeOopPtr::make_from_klass(array_klass)->isa_aryptr(); ! casted_ary = _gvn.transform(new CheckCastPPNode(control(), casted_ary, arytype)); ! Node* casted_adr = array_element_address(casted_ary, idx, T_OBJECT, arytype->size(), control()); ! if (!val->is_ValueType()) { ! assert(!gvn().type(val)->maybe_null(), "value type array elements should never be null"); ! val = ValueTypeNode::make_from_oop(this, val, vk); } ! val->as_ValueType()->store_flattened(this, casted_ary, casted_adr); ideal.sync_kit(this); } else if (!ideal.ctrl()->is_top()) { // Element type is unknown, emit runtime call sync_kit(ideal);
*** 330,349 **** ideal.sync_kit(this); ideal.make_leaf_call(OptoRuntime::store_unknown_value_Type(), CAST_FROM_FN_PTR(address, OptoRuntime::store_unknown_value), "store_unknown_value", ! cast_val, ary, idx); sync_kit(ideal); // Same as MemBarCPUOrder above: keep this unknown // flattened array access correctly ordered with other ! // flattened array access insert_mem_bar_volatile(Op_MemBarCPUOrder, C->get_alias_index(TypeAryPtr::VALUES)); ideal.sync_kit(this); } } ideal.end_if(); sync_kit(ideal); return; } else if (!ary_t->is_not_null_free()) { // Array is not flattened but may be null free --- 326,353 ---- ideal.sync_kit(this); ideal.make_leaf_call(OptoRuntime::store_unknown_value_Type(), CAST_FROM_FN_PTR(address, OptoRuntime::store_unknown_value), "store_unknown_value", ! val, casted_ary, idx); sync_kit(ideal); // Same as MemBarCPUOrder above: keep this unknown // flattened array access correctly ordered with other ! // flattened array accesses. insert_mem_bar_volatile(Op_MemBarCPUOrder, C->get_alias_index(TypeAryPtr::VALUES)); ideal.sync_kit(this); } } + ideal.else_(); + { + // non-flattened + sync_kit(ideal); + gen_value_array_null_guard(ary, cast_val, 3); + access_store_at(ary, adr, adr_type, cast_val, elemtype, bt, MO_UNORDERED | IN_HEAP | IS_ARRAY, false, false); + ideal.sync_kit(this); + } ideal.end_if(); sync_kit(ideal); return; } else if (!ary_t->is_not_null_free()) { // Array is not flattened but may be null free
< prev index next >