< prev index next >

src/hotspot/share/opto/graphKit.cpp

Print this page




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


< prev index next >