1743 transform_later(rawmem);
1744 }
1745 }
1746
1747 // Helper for PhaseMacroExpand::expand_allocate_common.
1748 // Initializes the newly-allocated storage.
1749 Node*
1750 PhaseMacroExpand::initialize_object(AllocateNode* alloc,
1751 Node* control, Node* rawmem, Node* object,
1752 Node* klass_node, Node* length,
1753 Node* size_in_bytes) {
1754 InitializeNode* init = alloc->initialization();
1755 // Store the klass & mark bits
1756 Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem);
1757 if (!mark_node->is_Con()) {
1758 transform_later(mark_node);
1759 }
1760 rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
1761
1762 if (!UseCompactObjectHeaders) {
1763 rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_METADATA);
1764 }
1765 int header_size = alloc->minimum_header_size(); // conservatively small
1766
1767 // Array length
1768 if (length != nullptr) { // Arrays need length field
1769 rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
1770 // conservatively small header size:
1771 header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
1772 if (_igvn.type(klass_node)->isa_aryklassptr()) { // we know the exact header size in most cases:
1773 BasicType elem = _igvn.type(klass_node)->is_klassptr()->as_instance_type()->isa_aryptr()->elem()->array_element_basic_type();
1774 if (is_reference_type(elem, true)) {
1775 elem = T_OBJECT;
1776 }
1777 header_size = Klass::layout_helper_header_size(Klass::array_layout_helper(elem));
1778 }
1779 }
1780
1781 // Clear the object body, if necessary.
1782 if (init == nullptr) {
1783 // The init has somehow disappeared; be cautious and clear everything.
2369 Node* superklass = check->in(SubTypeCheckNode::SuperKlass);
2370 assert(bol->is_Bool() && bol->as_Bool()->_test._test == BoolTest::ne, "unexpected bool node");
2371
2372 for (DUIterator_Last imin, i = bol->last_outs(imin); i >= imin; --i) {
2373 Node* iff = bol->last_out(i);
2374 assert(iff->is_If(), "where's the if?");
2375
2376 if (iff->in(0)->is_top()) {
2377 _igvn.replace_input_of(iff, 1, C->top());
2378 continue;
2379 }
2380
2381 Node* iftrue = iff->as_If()->proj_out(1);
2382 Node* iffalse = iff->as_If()->proj_out(0);
2383 Node* ctrl = iff->in(0);
2384
2385 Node* subklass = nullptr;
2386 if (_igvn.type(obj_or_subklass)->isa_klassptr()) {
2387 subklass = obj_or_subklass;
2388 } else {
2389 Node* k_adr = basic_plus_adr(obj_or_subklass, oopDesc::klass_offset_in_bytes());
2390 subklass = _igvn.transform(LoadKlassNode::make(_igvn, C->immutable_memory(), k_adr, TypeInstPtr::KLASS));
2391 }
2392
2393 Node* not_subtype_ctrl = Phase::gen_subtype_check(subklass, superklass, &ctrl, nullptr, _igvn, check->method(), check->bci());
2394
2395 _igvn.replace_input_of(iff, 0, C->top());
2396 _igvn.replace_node(iftrue, not_subtype_ctrl);
2397 _igvn.replace_node(iffalse, ctrl);
2398 }
2399 _igvn.replace_node(check, C->top());
2400 }
2401
2402 // Perform refining of strip mined loop nodes in the macro nodes list.
2403 void PhaseMacroExpand::refine_strip_mined_loop_macro_nodes() {
2404 for (int i = C->macro_count(); i > 0; i--) {
2405 Node* n = C->macro_node(i - 1);
2406 if (n->is_OuterStripMinedLoop()) {
2407 n->as_OuterStripMinedLoop()->adjust_strip_mined_loop(&_igvn);
2408 }
2409 }
|
1743 transform_later(rawmem);
1744 }
1745 }
1746
1747 // Helper for PhaseMacroExpand::expand_allocate_common.
1748 // Initializes the newly-allocated storage.
1749 Node*
1750 PhaseMacroExpand::initialize_object(AllocateNode* alloc,
1751 Node* control, Node* rawmem, Node* object,
1752 Node* klass_node, Node* length,
1753 Node* size_in_bytes) {
1754 InitializeNode* init = alloc->initialization();
1755 // Store the klass & mark bits
1756 Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem);
1757 if (!mark_node->is_Con()) {
1758 transform_later(mark_node);
1759 }
1760 rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
1761
1762 if (!UseCompactObjectHeaders) {
1763 rawmem = make_store(control, rawmem, object, Type::klass_offset(), klass_node, T_METADATA);
1764 }
1765 int header_size = alloc->minimum_header_size(); // conservatively small
1766
1767 // Array length
1768 if (length != nullptr) { // Arrays need length field
1769 rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
1770 // conservatively small header size:
1771 header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
1772 if (_igvn.type(klass_node)->isa_aryklassptr()) { // we know the exact header size in most cases:
1773 BasicType elem = _igvn.type(klass_node)->is_klassptr()->as_instance_type()->isa_aryptr()->elem()->array_element_basic_type();
1774 if (is_reference_type(elem, true)) {
1775 elem = T_OBJECT;
1776 }
1777 header_size = Klass::layout_helper_header_size(Klass::array_layout_helper(elem));
1778 }
1779 }
1780
1781 // Clear the object body, if necessary.
1782 if (init == nullptr) {
1783 // The init has somehow disappeared; be cautious and clear everything.
2369 Node* superklass = check->in(SubTypeCheckNode::SuperKlass);
2370 assert(bol->is_Bool() && bol->as_Bool()->_test._test == BoolTest::ne, "unexpected bool node");
2371
2372 for (DUIterator_Last imin, i = bol->last_outs(imin); i >= imin; --i) {
2373 Node* iff = bol->last_out(i);
2374 assert(iff->is_If(), "where's the if?");
2375
2376 if (iff->in(0)->is_top()) {
2377 _igvn.replace_input_of(iff, 1, C->top());
2378 continue;
2379 }
2380
2381 Node* iftrue = iff->as_If()->proj_out(1);
2382 Node* iffalse = iff->as_If()->proj_out(0);
2383 Node* ctrl = iff->in(0);
2384
2385 Node* subklass = nullptr;
2386 if (_igvn.type(obj_or_subklass)->isa_klassptr()) {
2387 subklass = obj_or_subklass;
2388 } else {
2389 Node* k_adr = basic_plus_adr(obj_or_subklass, Type::klass_offset());
2390 subklass = _igvn.transform(LoadKlassNode::make(_igvn, C->immutable_memory(), k_adr, TypeInstPtr::KLASS));
2391 }
2392
2393 Node* not_subtype_ctrl = Phase::gen_subtype_check(subklass, superklass, &ctrl, nullptr, _igvn, check->method(), check->bci());
2394
2395 _igvn.replace_input_of(iff, 0, C->top());
2396 _igvn.replace_node(iftrue, not_subtype_ctrl);
2397 _igvn.replace_node(iffalse, ctrl);
2398 }
2399 _igvn.replace_node(check, C->top());
2400 }
2401
2402 // Perform refining of strip mined loop nodes in the macro nodes list.
2403 void PhaseMacroExpand::refine_strip_mined_loop_macro_nodes() {
2404 for (int i = C->macro_count(); i > 0; i--) {
2405 Node* n = C->macro_node(i - 1);
2406 if (n->is_OuterStripMinedLoop()) {
2407 n->as_OuterStripMinedLoop()->adjust_strip_mined_loop(&_igvn);
2408 }
2409 }
|