1681 if (adr_type->isa_instptr()) {
1682 if (at->field() != NULL) {
1683 // known field. This code is a copy of the do_put_xxx logic.
1684 ciField* field = at->field();
1685 if (!field->type()->is_loaded()) {
1686 val_type = TypeInstPtr::BOTTOM;
1687 } else {
1688 val_type = TypeOopPtr::make_from_klass(field->type()->as_klass());
1689 }
1690 }
1691 } else if (adr_type->isa_aryptr()) {
1692 val_type = adr_type->is_aryptr()->elem()->make_oopptr();
1693 }
1694 if (val_type == NULL) {
1695 val_type = TypeInstPtr::BOTTOM;
1696 }
1697 return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true, mo, mismatched);
1698 }
1699
1700 Node* GraphKit::load_barrier(Node* val, Node* adr, bool weak, bool writeback, bool oop_reload_allowed) {
1701 assert(UseLoadBarrier, "invariant");
1702 Node* barrier = new LoadBarrierNode(C, control(), memory(TypeRawPtr::BOTTOM), val, adr, weak, writeback, oop_reload_allowed);
1703 Node* transformed_barrier = _gvn.transform(barrier);
1704
1705 if (transformed_barrier->is_LoadBarrier()) {
1706 if (barrier == transformed_barrier) {
1707 set_control(_gvn.transform(new ProjNode(barrier, LoadBarrierNode::Control)));
1708 }
1709 return _gvn.transform(new ProjNode(transformed_barrier, LoadBarrierNode::Oop));
1710 } else {
1711 return val;
1712 }
1713 }
1714
1715 //-------------------------array_element_address-------------------------
1716 Node* GraphKit::array_element_address(Node* ary, Node* idx, BasicType elembt,
1717 const TypeInt* sizetype, Node* ctrl) {
1718 uint shift = exact_log2(type2aelembytes(elembt));
1719 uint header = arrayOopDesc::base_offset_in_bytes(elembt);
1720
1721 // short-circuit a common case (saves lots of confusing waste motion)
4398
4399 Node* GraphKit::load_String_length(Node* ctrl, Node* str) {
4400 Node* len = load_array_length(load_String_value(ctrl, str));
4401 Node* coder = load_String_coder(ctrl, str);
4402 // Divide length by 2 if coder is UTF16
4403 return _gvn.transform(new RShiftINode(len, coder));
4404 }
4405
4406 Node* GraphKit::load_String_value(Node* ctrl, Node* str) {
4407 int value_offset = java_lang_String::value_offset_in_bytes();
4408 const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
4409 false, NULL, 0);
4410 const TypePtr* value_field_type = string_type->add_offset(value_offset);
4411 const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull,
4412 TypeAry::make(TypeInt::BYTE, TypeInt::POS),
4413 ciTypeArrayKlass::make(T_BYTE), true, 0);
4414 int value_field_idx = C->get_alias_index(value_field_type);
4415 Node* adr = basic_plus_adr(str, str, value_offset);
4416 Node* load = make_load(ctrl, adr,
4417 value_type, T_OBJECT, value_field_idx, MemNode::unordered);
4418 if (UseLoadBarrier) {
4419 load = load_barrier(load, adr);
4420 }
4421
4422 // String.value field is known to be @Stable.
4423 if (UseImplicitStableValues) {
4424 load = cast_array_to_stable(load, value_type);
4425 }
4426 return load;
4427 }
4428
4429 Node* GraphKit::load_String_coder(Node* ctrl, Node* str) {
4430 if (!CompactStrings) {
4431 return intcon(java_lang_String::CODER_UTF16);
4432 }
4433 int coder_offset = java_lang_String::coder_offset_in_bytes();
4434 const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
4435 false, NULL, 0);
4436 const TypePtr* coder_field_type = string_type->add_offset(coder_offset);
4437 int coder_field_idx = C->get_alias_index(coder_field_type);
4438 return make_load(ctrl, basic_plus_adr(str, str, coder_offset),
|
1681 if (adr_type->isa_instptr()) {
1682 if (at->field() != NULL) {
1683 // known field. This code is a copy of the do_put_xxx logic.
1684 ciField* field = at->field();
1685 if (!field->type()->is_loaded()) {
1686 val_type = TypeInstPtr::BOTTOM;
1687 } else {
1688 val_type = TypeOopPtr::make_from_klass(field->type()->as_klass());
1689 }
1690 }
1691 } else if (adr_type->isa_aryptr()) {
1692 val_type = adr_type->is_aryptr()->elem()->make_oopptr();
1693 }
1694 if (val_type == NULL) {
1695 val_type = TypeInstPtr::BOTTOM;
1696 }
1697 return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true, mo, mismatched);
1698 }
1699
1700 Node* GraphKit::load_barrier(Node* val, Node* adr, bool weak, bool writeback, bool oop_reload_allowed) {
1701 assert(UseZGC, "invariant");
1702 Node* barrier = new LoadBarrierNode(C, control(), memory(TypeRawPtr::BOTTOM), val, adr, weak, writeback, oop_reload_allowed);
1703 Node* transformed_barrier = _gvn.transform(barrier);
1704
1705 if (transformed_barrier->is_LoadBarrier()) {
1706 if (barrier == transformed_barrier) {
1707 set_control(_gvn.transform(new ProjNode(barrier, LoadBarrierNode::Control)));
1708 }
1709 return _gvn.transform(new ProjNode(transformed_barrier, LoadBarrierNode::Oop));
1710 } else {
1711 return val;
1712 }
1713 }
1714
1715 //-------------------------array_element_address-------------------------
1716 Node* GraphKit::array_element_address(Node* ary, Node* idx, BasicType elembt,
1717 const TypeInt* sizetype, Node* ctrl) {
1718 uint shift = exact_log2(type2aelembytes(elembt));
1719 uint header = arrayOopDesc::base_offset_in_bytes(elembt);
1720
1721 // short-circuit a common case (saves lots of confusing waste motion)
4398
4399 Node* GraphKit::load_String_length(Node* ctrl, Node* str) {
4400 Node* len = load_array_length(load_String_value(ctrl, str));
4401 Node* coder = load_String_coder(ctrl, str);
4402 // Divide length by 2 if coder is UTF16
4403 return _gvn.transform(new RShiftINode(len, coder));
4404 }
4405
4406 Node* GraphKit::load_String_value(Node* ctrl, Node* str) {
4407 int value_offset = java_lang_String::value_offset_in_bytes();
4408 const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
4409 false, NULL, 0);
4410 const TypePtr* value_field_type = string_type->add_offset(value_offset);
4411 const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull,
4412 TypeAry::make(TypeInt::BYTE, TypeInt::POS),
4413 ciTypeArrayKlass::make(T_BYTE), true, 0);
4414 int value_field_idx = C->get_alias_index(value_field_type);
4415 Node* adr = basic_plus_adr(str, str, value_offset);
4416 Node* load = make_load(ctrl, adr,
4417 value_type, T_OBJECT, value_field_idx, MemNode::unordered);
4418 if (UseZGC) {
4419 load = load_barrier(load, adr);
4420 }
4421
4422 // String.value field is known to be @Stable.
4423 if (UseImplicitStableValues) {
4424 load = cast_array_to_stable(load, value_type);
4425 }
4426 return load;
4427 }
4428
4429 Node* GraphKit::load_String_coder(Node* ctrl, Node* str) {
4430 if (!CompactStrings) {
4431 return intcon(java_lang_String::CODER_UTF16);
4432 }
4433 int coder_offset = java_lang_String::coder_offset_in_bytes();
4434 const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
4435 false, NULL, 0);
4436 const TypePtr* coder_field_type = string_type->add_offset(coder_offset);
4437 int coder_field_idx = C->get_alias_index(coder_field_type);
4438 return make_load(ctrl, basic_plus_adr(str, str, coder_offset),
|