< prev index next >

src/hotspot/share/opto/macro.cpp

Print this page




1703                                           Node* control, Node* rawmem, Node* object,
1704                                           Node* klass_node, Node* length,
1705                                           Node* size_in_bytes) {
1706   InitializeNode* init = alloc->initialization();
1707   // Store the klass & mark bits
1708   Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem, klass_node);
1709   if (!mark_node->is_Con()) {
1710     transform_later(mark_node);
1711   }
1712   rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
1713 
1714   BasicType bt = T_METADATA;
1715   Node* metadata = klass_node;
1716   Node* properties = alloc->in(AllocateNode::StorageProperties);
1717   if (properties != NULL) {
1718     // Encode array storage properties into klass pointer
1719     assert(EnableValhalla, "array storage properties not supported");
1720     if (UseCompressedClassPointers) {
1721       // Compress the klass pointer before inserting the storage properties value
1722       metadata = transform_later(new EncodePKlassNode(metadata, metadata->bottom_type()->make_narrowklass()));
1723     }



1724     metadata = transform_later(new CastP2XNode(NULL, metadata));
1725     metadata = transform_later(new OrXNode(metadata, properties));
1726     bt = T_LONG;
1727     if (UseCompressedClassPointers) {
1728       bt = T_INT;
1729       metadata = transform_later(new ConvL2INode(metadata));
1730     }
1731   }
1732   rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), metadata, bt);
1733 
1734   int header_size = alloc->minimum_header_size();  // conservatively small
1735 
1736   // Array length
1737   if (length != NULL) {         // Arrays need length field
1738     rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
1739     // conservatively small header size:
1740     header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
1741     ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass();
1742     if (k->is_array_klass())    // we know the exact header size in most cases:
1743       header_size = Klass::layout_helper_header_size(k->layout_helper());
1744   }
1745 
1746   // Clear the object body, if necessary.
1747   if (init == NULL) {
1748     // The init has somehow disappeared; be cautious and clear everything.
1749     //




1703                                           Node* control, Node* rawmem, Node* object,
1704                                           Node* klass_node, Node* length,
1705                                           Node* size_in_bytes) {
1706   InitializeNode* init = alloc->initialization();
1707   // Store the klass & mark bits
1708   Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem, klass_node);
1709   if (!mark_node->is_Con()) {
1710     transform_later(mark_node);
1711   }
1712   rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
1713 
1714   BasicType bt = T_METADATA;
1715   Node* metadata = klass_node;
1716   Node* properties = alloc->in(AllocateNode::StorageProperties);
1717   if (properties != NULL) {
1718     // Encode array storage properties into klass pointer
1719     assert(EnableValhalla, "array storage properties not supported");
1720     if (UseCompressedClassPointers) {
1721       // Compress the klass pointer before inserting the storage properties value
1722       metadata = transform_later(new EncodePKlassNode(metadata, metadata->bottom_type()->make_narrowklass()));
1723       metadata = transform_later(new CastN2INode(metadata));
1724       metadata = transform_later(new OrINode(metadata, transform_later(new ConvL2INode(properties))));
1725       bt = T_INT;
1726     } else {
1727       metadata = transform_later(new CastP2XNode(NULL, metadata));
1728       metadata = transform_later(new OrXNode(metadata, properties));
1729       bt = T_LONG;



1730     }
1731   }
1732   rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), metadata, bt);
1733 
1734   int header_size = alloc->minimum_header_size();  // conservatively small
1735 
1736   // Array length
1737   if (length != NULL) {         // Arrays need length field
1738     rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
1739     // conservatively small header size:
1740     header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
1741     ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass();
1742     if (k->is_array_klass())    // we know the exact header size in most cases:
1743       header_size = Klass::layout_helper_header_size(k->layout_helper());
1744   }
1745 
1746   // Clear the object body, if necessary.
1747   if (init == NULL) {
1748     // The init has somehow disappeared; be cautious and clear everything.
1749     //


< prev index next >