1183 }
1184 Node* conv = _gvn.transform( new ConvI2LNode(offset));
1185 Node* mask = _gvn.transform(ConLNode::make((julong) max_juint));
1186 return _gvn.transform( new AndLNode(conv, mask) );
1187 }
1188
1189 Node* GraphKit::ConvL2I(Node* offset) {
1190 // short-circuit a common case
1191 jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot);
1192 if (offset_con != (jlong)Type::OffsetBot) {
1193 return intcon((int) offset_con);
1194 }
1195 return _gvn.transform( new ConvL2INode(offset));
1196 }
1197
1198 //-------------------------load_object_klass-----------------------------------
1199 Node* GraphKit::load_object_klass(Node* obj) {
1200 // Special-case a fresh allocation to avoid building nodes:
1201 Node* akls = AllocateNode::Ideal_klass(obj, &_gvn);
1202 if (akls != nullptr) return akls;
1203 Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
1204 return _gvn.transform(LoadKlassNode::make(_gvn, nullptr, immutable_memory(), k_adr, TypeInstPtr::KLASS));
1205 }
1206
1207 //-------------------------load_array_length-----------------------------------
1208 Node* GraphKit::load_array_length(Node* array) {
1209 // Special-case a fresh allocation to avoid building nodes:
1210 AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array);
1211 Node *alen;
1212 if (alloc == nullptr) {
1213 Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
1214 alen = _gvn.transform( new LoadRangeNode(nullptr, immutable_memory(), r_adr, TypeInt::POS));
1215 } else {
1216 alen = array_ideal_length(alloc, _gvn.type(array)->is_oopptr(), false);
1217 }
1218 return alen;
1219 }
1220
1221 Node* GraphKit::array_ideal_length(AllocateArrayNode* alloc,
1222 const TypeOopPtr* oop_type,
1223 bool replace_length_in_map) {
3647
3648 // put in an initialization barrier
3649 InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
3650 rawoop)->as_Initialize();
3651 assert(alloc->initialization() == init, "2-way macro link must work");
3652 assert(init ->allocation() == alloc, "2-way macro link must work");
3653 {
3654 // Extract memory strands which may participate in the new object's
3655 // initialization, and source them from the new InitializeNode.
3656 // This will allow us to observe initializations when they occur,
3657 // and link them properly (as a group) to the InitializeNode.
3658 assert(init->in(InitializeNode::Memory) == malloc, "");
3659 MergeMemNode* minit_in = MergeMemNode::make(malloc);
3660 init->set_req(InitializeNode::Memory, minit_in);
3661 record_for_igvn(minit_in); // fold it up later, if possible
3662 Node* minit_out = memory(rawidx);
3663 assert(minit_out->is_Proj() && minit_out->in(0) == init, "");
3664 // Add an edge in the MergeMem for the header fields so an access
3665 // to one of those has correct memory state
3666 set_memory(minit_out, C->get_alias_index(oop_type->add_offset(oopDesc::mark_offset_in_bytes())));
3667 set_memory(minit_out, C->get_alias_index(oop_type->add_offset(oopDesc::klass_offset_in_bytes())));
3668 if (oop_type->isa_aryptr()) {
3669 const TypePtr* telemref = oop_type->add_offset(Type::OffsetBot);
3670 int elemidx = C->get_alias_index(telemref);
3671 hook_memory_on_init(*this, elemidx, minit_in, minit_out);
3672 } else if (oop_type->isa_instptr()) {
3673 ciInstanceKlass* ik = oop_type->is_instptr()->instance_klass();
3674 for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) {
3675 ciField* field = ik->nonstatic_field_at(i);
3676 if (field->offset_in_bytes() >= TrackedInitializationLimit * HeapWordSize)
3677 continue; // do not bother to track really large numbers of fields
3678 // Find (or create) the alias category for this field:
3679 int fieldidx = C->alias_type(field)->index();
3680 hook_memory_on_init(*this, fieldidx, minit_in, minit_out);
3681 }
3682 }
3683 }
3684
3685 // Cast raw oop to the real thing...
3686 Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type);
3687 javaoop = _gvn.transform(javaoop);
|
1183 }
1184 Node* conv = _gvn.transform( new ConvI2LNode(offset));
1185 Node* mask = _gvn.transform(ConLNode::make((julong) max_juint));
1186 return _gvn.transform( new AndLNode(conv, mask) );
1187 }
1188
1189 Node* GraphKit::ConvL2I(Node* offset) {
1190 // short-circuit a common case
1191 jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot);
1192 if (offset_con != (jlong)Type::OffsetBot) {
1193 return intcon((int) offset_con);
1194 }
1195 return _gvn.transform( new ConvL2INode(offset));
1196 }
1197
1198 //-------------------------load_object_klass-----------------------------------
1199 Node* GraphKit::load_object_klass(Node* obj) {
1200 // Special-case a fresh allocation to avoid building nodes:
1201 Node* akls = AllocateNode::Ideal_klass(obj, &_gvn);
1202 if (akls != nullptr) return akls;
1203 Node* k_adr = basic_plus_adr(obj, Type::klass_offset());
1204 return _gvn.transform(LoadKlassNode::make(_gvn, nullptr, immutable_memory(), k_adr, TypeInstPtr::KLASS));
1205 }
1206
1207 //-------------------------load_array_length-----------------------------------
1208 Node* GraphKit::load_array_length(Node* array) {
1209 // Special-case a fresh allocation to avoid building nodes:
1210 AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array);
1211 Node *alen;
1212 if (alloc == nullptr) {
1213 Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
1214 alen = _gvn.transform( new LoadRangeNode(nullptr, immutable_memory(), r_adr, TypeInt::POS));
1215 } else {
1216 alen = array_ideal_length(alloc, _gvn.type(array)->is_oopptr(), false);
1217 }
1218 return alen;
1219 }
1220
1221 Node* GraphKit::array_ideal_length(AllocateArrayNode* alloc,
1222 const TypeOopPtr* oop_type,
1223 bool replace_length_in_map) {
3647
3648 // put in an initialization barrier
3649 InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
3650 rawoop)->as_Initialize();
3651 assert(alloc->initialization() == init, "2-way macro link must work");
3652 assert(init ->allocation() == alloc, "2-way macro link must work");
3653 {
3654 // Extract memory strands which may participate in the new object's
3655 // initialization, and source them from the new InitializeNode.
3656 // This will allow us to observe initializations when they occur,
3657 // and link them properly (as a group) to the InitializeNode.
3658 assert(init->in(InitializeNode::Memory) == malloc, "");
3659 MergeMemNode* minit_in = MergeMemNode::make(malloc);
3660 init->set_req(InitializeNode::Memory, minit_in);
3661 record_for_igvn(minit_in); // fold it up later, if possible
3662 Node* minit_out = memory(rawidx);
3663 assert(minit_out->is_Proj() && minit_out->in(0) == init, "");
3664 // Add an edge in the MergeMem for the header fields so an access
3665 // to one of those has correct memory state
3666 set_memory(minit_out, C->get_alias_index(oop_type->add_offset(oopDesc::mark_offset_in_bytes())));
3667 set_memory(minit_out, C->get_alias_index(oop_type->add_offset(Type::klass_offset())));
3668 if (oop_type->isa_aryptr()) {
3669 const TypePtr* telemref = oop_type->add_offset(Type::OffsetBot);
3670 int elemidx = C->get_alias_index(telemref);
3671 hook_memory_on_init(*this, elemidx, minit_in, minit_out);
3672 } else if (oop_type->isa_instptr()) {
3673 ciInstanceKlass* ik = oop_type->is_instptr()->instance_klass();
3674 for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) {
3675 ciField* field = ik->nonstatic_field_at(i);
3676 if (field->offset_in_bytes() >= TrackedInitializationLimit * HeapWordSize)
3677 continue; // do not bother to track really large numbers of fields
3678 // Find (or create) the alias category for this field:
3679 int fieldidx = C->alias_type(field)->index();
3680 hook_memory_on_init(*this, fieldidx, minit_in, minit_out);
3681 }
3682 }
3683 }
3684
3685 // Cast raw oop to the real thing...
3686 Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type);
3687 javaoop = _gvn.transform(javaoop);
|