< prev index next >

src/hotspot/share/opto/graphKit.cpp

Print this page

1257   }
1258   Node* conv = _gvn.transform( new ConvI2LNode(offset));
1259   Node* mask = _gvn.transform(ConLNode::make((julong) max_juint));
1260   return _gvn.transform( new AndLNode(conv, mask) );
1261 }
1262 
1263 Node* GraphKit::ConvL2I(Node* offset) {
1264   // short-circuit a common case
1265   jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot);
1266   if (offset_con != (jlong)Type::OffsetBot) {
1267     return intcon((int) offset_con);
1268   }
1269   return _gvn.transform( new ConvL2INode(offset));
1270 }
1271 
1272 //-------------------------load_object_klass-----------------------------------
1273 Node* GraphKit::load_object_klass(Node* obj) {
1274   // Special-case a fresh allocation to avoid building nodes:
1275   Node* akls = AllocateNode::Ideal_klass(obj, &_gvn);
1276   if (akls != nullptr)  return akls;
1277   Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
1278   return _gvn.transform(LoadKlassNode::make(_gvn, immutable_memory(), k_adr, TypeInstPtr::KLASS));
1279 }
1280 
1281 //-------------------------load_array_length-----------------------------------
1282 Node* GraphKit::load_array_length(Node* array) {
1283   // Special-case a fresh allocation to avoid building nodes:
1284   AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array);
1285   Node *alen;
1286   if (alloc == nullptr) {
1287     Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
1288     alen = _gvn.transform( new LoadRangeNode(nullptr, immutable_memory(), r_adr, TypeInt::POS));
1289   } else {
1290     alen = array_ideal_length(alloc, _gvn.type(array)->is_oopptr(), false);
1291   }
1292   return alen;
1293 }
1294 
1295 Node* GraphKit::array_ideal_length(AllocateArrayNode* alloc,
1296                                    const TypeOopPtr* oop_type,
1297                                    bool replace_length_in_map) {

3721   InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
3722                                                  rawoop)->as_Initialize();
3723   assert(alloc->initialization() == init,  "2-way macro link must work");
3724   assert(init ->allocation()     == alloc, "2-way macro link must work");
3725   {
3726     // Extract memory strands which may participate in the new object's
3727     // initialization, and source them from the new InitializeNode.
3728     // This will allow us to observe initializations when they occur,
3729     // and link them properly (as a group) to the InitializeNode.
3730     assert(init->in(InitializeNode::Memory) == malloc, "");
3731     MergeMemNode* minit_in = MergeMemNode::make(malloc);
3732     init->set_req(InitializeNode::Memory, minit_in);
3733     record_for_igvn(minit_in); // fold it up later, if possible
3734     Node* minit_out = memory(rawidx);
3735     assert(minit_out->is_Proj() && minit_out->in(0) == init, "");
3736     int mark_idx = C->get_alias_index(oop_type->add_offset(oopDesc::mark_offset_in_bytes()));
3737     // Add an edge in the MergeMem for the header fields so an access to one of those has correct memory state.
3738     // Use one NarrowMemProjNode per slice to properly record the adr type of each slice. The Initialize node will have
3739     // multiple projections as a result.
3740     set_memory(_gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(mark_idx))), mark_idx);
3741     int klass_idx = C->get_alias_index(oop_type->add_offset(oopDesc::klass_offset_in_bytes()));
3742     set_memory(_gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(klass_idx))), klass_idx);
3743     if (oop_type->isa_aryptr()) {
3744       const TypePtr* telemref = oop_type->add_offset(Type::OffsetBot);
3745       int            elemidx  = C->get_alias_index(telemref);
3746       hook_memory_on_init(*this, elemidx, minit_in, _gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(elemidx))));
3747     } else if (oop_type->isa_instptr()) {
3748       ciInstanceKlass* ik = oop_type->is_instptr()->instance_klass();
3749       for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) {
3750         ciField* field = ik->nonstatic_field_at(i);
3751         if (field->offset_in_bytes() >= TrackedInitializationLimit * HeapWordSize)
3752           continue;  // do not bother to track really large numbers of fields
3753         // Find (or create) the alias category for this field:
3754         int fieldidx = C->alias_type(field)->index();
3755         hook_memory_on_init(*this, fieldidx, minit_in, _gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(fieldidx))));
3756       }
3757     }
3758   }
3759 
3760   // Cast raw oop to the real thing...
3761   Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type);

1257   }
1258   Node* conv = _gvn.transform( new ConvI2LNode(offset));
1259   Node* mask = _gvn.transform(ConLNode::make((julong) max_juint));
1260   return _gvn.transform( new AndLNode(conv, mask) );
1261 }
1262 
1263 Node* GraphKit::ConvL2I(Node* offset) {
1264   // short-circuit a common case
1265   jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot);
1266   if (offset_con != (jlong)Type::OffsetBot) {
1267     return intcon((int) offset_con);
1268   }
1269   return _gvn.transform( new ConvL2INode(offset));
1270 }
1271 
1272 //-------------------------load_object_klass-----------------------------------
1273 Node* GraphKit::load_object_klass(Node* obj) {
1274   // Special-case a fresh allocation to avoid building nodes:
1275   Node* akls = AllocateNode::Ideal_klass(obj, &_gvn);
1276   if (akls != nullptr)  return akls;
1277   Node* k_adr = basic_plus_adr(obj, Type::klass_offset());
1278   return _gvn.transform(LoadKlassNode::make(_gvn, immutable_memory(), k_adr, TypeInstPtr::KLASS));
1279 }
1280 
1281 //-------------------------load_array_length-----------------------------------
1282 Node* GraphKit::load_array_length(Node* array) {
1283   // Special-case a fresh allocation to avoid building nodes:
1284   AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array);
1285   Node *alen;
1286   if (alloc == nullptr) {
1287     Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
1288     alen = _gvn.transform( new LoadRangeNode(nullptr, immutable_memory(), r_adr, TypeInt::POS));
1289   } else {
1290     alen = array_ideal_length(alloc, _gvn.type(array)->is_oopptr(), false);
1291   }
1292   return alen;
1293 }
1294 
1295 Node* GraphKit::array_ideal_length(AllocateArrayNode* alloc,
1296                                    const TypeOopPtr* oop_type,
1297                                    bool replace_length_in_map) {

3721   InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
3722                                                  rawoop)->as_Initialize();
3723   assert(alloc->initialization() == init,  "2-way macro link must work");
3724   assert(init ->allocation()     == alloc, "2-way macro link must work");
3725   {
3726     // Extract memory strands which may participate in the new object's
3727     // initialization, and source them from the new InitializeNode.
3728     // This will allow us to observe initializations when they occur,
3729     // and link them properly (as a group) to the InitializeNode.
3730     assert(init->in(InitializeNode::Memory) == malloc, "");
3731     MergeMemNode* minit_in = MergeMemNode::make(malloc);
3732     init->set_req(InitializeNode::Memory, minit_in);
3733     record_for_igvn(minit_in); // fold it up later, if possible
3734     Node* minit_out = memory(rawidx);
3735     assert(minit_out->is_Proj() && minit_out->in(0) == init, "");
3736     int mark_idx = C->get_alias_index(oop_type->add_offset(oopDesc::mark_offset_in_bytes()));
3737     // Add an edge in the MergeMem for the header fields so an access to one of those has correct memory state.
3738     // Use one NarrowMemProjNode per slice to properly record the adr type of each slice. The Initialize node will have
3739     // multiple projections as a result.
3740     set_memory(_gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(mark_idx))), mark_idx);
3741     int klass_idx = C->get_alias_index(oop_type->add_offset(Type::klass_offset()));
3742     set_memory(_gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(klass_idx))), klass_idx);
3743     if (oop_type->isa_aryptr()) {
3744       const TypePtr* telemref = oop_type->add_offset(Type::OffsetBot);
3745       int            elemidx  = C->get_alias_index(telemref);
3746       hook_memory_on_init(*this, elemidx, minit_in, _gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(elemidx))));
3747     } else if (oop_type->isa_instptr()) {
3748       ciInstanceKlass* ik = oop_type->is_instptr()->instance_klass();
3749       for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) {
3750         ciField* field = ik->nonstatic_field_at(i);
3751         if (field->offset_in_bytes() >= TrackedInitializationLimit * HeapWordSize)
3752           continue;  // do not bother to track really large numbers of fields
3753         // Find (or create) the alias category for this field:
3754         int fieldidx = C->alias_type(field)->index();
3755         hook_memory_on_init(*this, fieldidx, minit_in, _gvn.transform(new NarrowMemProjNode(init, C->get_adr_type(fieldidx))));
3756       }
3757     }
3758   }
3759 
3760   // Cast raw oop to the real thing...
3761   Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type);
< prev index next >