1684 rawmem = new ProjNode(call, TypeFunc::Memory);
1685 transform_later(rawmem);
1686 }
1687 }
1688
1689 // Helper for PhaseMacroExpand::expand_allocate_common.
1690 // Initializes the newly-allocated storage.
1691 Node*
1692 PhaseMacroExpand::initialize_object(AllocateNode* alloc,
1693 Node* control, Node* rawmem, Node* object,
1694 Node* klass_node, Node* length,
1695 Node* size_in_bytes) {
1696 InitializeNode* init = alloc->initialization();
1697 // Store the klass & mark bits
1698 Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem);
1699 if (!mark_node->is_Con()) {
1700 transform_later(mark_node);
1701 }
1702 rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
1703
1704 rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_METADATA);
1705 int header_size = alloc->minimum_header_size(); // conservatively small
1706
1707 // Array length
1708 if (length != nullptr) { // Arrays need length field
1709 rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
1710 // conservatively small header size:
1711 header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
1712 if (_igvn.type(klass_node)->isa_aryklassptr()) { // we know the exact header size in most cases:
1713 BasicType elem = _igvn.type(klass_node)->is_klassptr()->as_instance_type()->isa_aryptr()->elem()->array_element_basic_type();
1714 if (is_reference_type(elem, true)) {
1715 elem = T_OBJECT;
1716 }
1717 header_size = Klass::layout_helper_header_size(Klass::array_layout_helper(elem));
1718 }
1719 }
1720
1721 // Clear the object body, if necessary.
1722 if (init == nullptr) {
1723 // The init has somehow disappeared; be cautious and clear everything.
1724 //
|
1684 rawmem = new ProjNode(call, TypeFunc::Memory);
1685 transform_later(rawmem);
1686 }
1687 }
1688
1689 // Helper for PhaseMacroExpand::expand_allocate_common.
1690 // Initializes the newly-allocated storage.
1691 Node*
1692 PhaseMacroExpand::initialize_object(AllocateNode* alloc,
1693 Node* control, Node* rawmem, Node* object,
1694 Node* klass_node, Node* length,
1695 Node* size_in_bytes) {
1696 InitializeNode* init = alloc->initialization();
1697 // Store the klass & mark bits
1698 Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem);
1699 if (!mark_node->is_Con()) {
1700 transform_later(mark_node);
1701 }
1702 rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
1703
1704 if (!UseCompactObjectHeaders) {
1705 rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_METADATA);
1706 }
1707 int header_size = alloc->minimum_header_size(); // conservatively small
1708
1709 // Array length
1710 if (length != nullptr) { // Arrays need length field
1711 rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
1712 // conservatively small header size:
1713 header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
1714 if (_igvn.type(klass_node)->isa_aryklassptr()) { // we know the exact header size in most cases:
1715 BasicType elem = _igvn.type(klass_node)->is_klassptr()->as_instance_type()->isa_aryptr()->elem()->array_element_basic_type();
1716 if (is_reference_type(elem, true)) {
1717 elem = T_OBJECT;
1718 }
1719 header_size = Klass::layout_helper_header_size(Klass::array_layout_helper(elem));
1720 }
1721 }
1722
1723 // Clear the object body, if necessary.
1724 if (init == nullptr) {
1725 // The init has somehow disappeared; be cautious and clear everything.
1726 //
|