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 // |