< prev index next >
src/hotspot/share/opto/graphKit.cpp
Print this page
rev 55127 : 8223351: [lworld] Primary mirror and nullable mirror for inline type
Reviewed-by: tbd
@@ -3399,14 +3399,14 @@
set_control(null_ctl);
// Get array element mirror and corresponding value mirror
Node* array_type_mirror = load_mirror_from_klass(load_object_klass(ary));
Node* elem_mirror_adr = basic_plus_adr(array_type_mirror, java_lang_Class::component_mirror_offset_in_bytes());
Node* elem_mirror = access_load_at(array_type_mirror, elem_mirror_adr, _gvn.type(elem_mirror_adr)->is_ptr(), TypeInstPtr::MIRROR, T_OBJECT, IN_HEAP);
- Node* value_mirror_adr = basic_plus_adr(elem_mirror, java_lang_Class::value_mirror_offset_in_bytes());
- Node* value_mirror = access_load_at(elem_mirror, value_mirror_adr, _gvn.type(value_mirror_adr)->is_ptr(), TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR), T_OBJECT, IN_HEAP);
- // Deoptimize if elem_mirror == value_mirror => null-free array
- Node* cmp = _gvn.transform(new CmpPNode(elem_mirror, value_mirror));
+ Node* inline_mirror_adr = basic_plus_adr(elem_mirror, java_lang_Class::inline_mirror_offset_in_bytes());
+ Node* inline_mirror = access_load_at(elem_mirror, inline_mirror_adr, _gvn.type(inline_mirror_adr)->is_ptr(), TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR), T_OBJECT, IN_HEAP);
+ // Deoptimize if elem_mirror == inline_mirror => null-free array
+ Node* cmp = _gvn.transform(new CmpPNode(elem_mirror, inline_mirror));
Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
{ BuildCutout unless(this, bol, PROB_MAX);
inc_sp(nargs);
uncommon_trap(Deoptimization::Reason_null_check,
Deoptimization::Action_none);
@@ -4047,13 +4047,13 @@
Node* empty = MakeConX(ArrayStorageProperties::empty.encode<NOT_LP64(jint) LP64_ONLY(jlong)>(props_shift));
Node* null_free = MakeConX(ArrayStorageProperties::null_free.encode<NOT_LP64(jint) LP64_ONLY(jlong)>(props_shift));
Node* flat = MakeConX(ArrayStorageProperties::flattened_and_null_free.encode<NOT_LP64(jint) LP64_ONLY(jlong)>(props_shift));
// Check if element mirror is a value mirror
- Node* p = basic_plus_adr(elem_mirror, java_lang_Class::value_mirror_offset_in_bytes());
- Node* value_mirror = access_load_at(elem_mirror, p, _gvn.type(p)->is_ptr(), TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR), T_OBJECT, IN_HEAP);
- Node* cmp = _gvn.transform(new CmpPNode(elem_mirror, value_mirror));
+ Node* p = basic_plus_adr(elem_mirror, java_lang_Class::inline_mirror_offset_in_bytes());
+ Node* inline_mirror = access_load_at(elem_mirror, p, _gvn.type(p)->is_ptr(), TypeInstPtr::MIRROR, T_OBJECT, IN_HEAP);
+ Node* cmp = _gvn.transform(new CmpPNode(elem_mirror, inline_mirror));
Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
IfNode* iff = create_and_map_if(control(), bol, PROB_FAIR, COUNT_UNKNOWN);
// Not a value mirror but a box mirror or not a value type array, initialize with all zero
r->init_req(1, _gvn.transform(new IfFalseNode(iff)));
< prev index next >