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