1660 assert(projs->nb_resproj <= 1, "unexpected number of results");
1661 if (projs->fallthrough_catchproj != NULL) {
1662 igvn->replace_node(projs->fallthrough_catchproj, in(TypeFunc::Control));
1663 }
1664 if (projs->fallthrough_memproj != NULL) {
1665 igvn->replace_node(projs->fallthrough_memproj, in(TypeFunc::Memory));
1666 }
1667 if (projs->catchall_memproj != NULL) {
1668 igvn->replace_node(projs->catchall_memproj, phase->C->top());
1669 }
1670 if (projs->fallthrough_ioproj != NULL) {
1671 igvn->replace_node(projs->fallthrough_ioproj, in(TypeFunc::I_O));
1672 }
1673 if (projs->catchall_ioproj != NULL) {
1674 igvn->replace_node(projs->catchall_ioproj, phase->C->top());
1675 }
1676 if (projs->catchall_catchproj != NULL) {
1677 igvn->replace_node(projs->catchall_catchproj, phase->C->top());
1678 }
1679 if (projs->resproj[0] != NULL) {
1680 igvn->replace_node(projs->resproj[0], phase->C->top());
1681 }
1682 igvn->replace_node(this, phase->C->top());
1683 if (init != NULL) {
1684 Node* ctrl_proj = init->proj_out_or_null(TypeFunc::Control);
1685 Node* mem_proj = init->proj_out_or_null(TypeFunc::Memory);
1686 if (ctrl_proj != NULL) {
1687 igvn->replace_node(ctrl_proj, init->in(TypeFunc::Control));
1688 }
1689 if (mem_proj != NULL) {
1690 igvn->replace_node(mem_proj, init->in(TypeFunc::Memory));
1691 }
1692 }
1693 return NULL;
1694 }
1695
1696 return CallNode::Ideal(phase, can_reshape);
1697 }
1698
1699 Node *AllocateNode::make_ideal_mark(PhaseGVN *phase, Node* obj, Node* control, Node* mem) {
1700 Node* mark_node = NULL;
1701 // For now only enable fast locking for non-array types
1702 if ((EnableValhalla || UseBiasedLocking) && Opcode() == Op_Allocate) {
1703 Node* klass_node = in(AllocateNode::KlassNode);
1704 Node* proto_adr = phase->transform(new AddPNode(klass_node, klass_node, phase->MakeConX(in_bytes(Klass::prototype_header_offset()))));
1705 mark_node = LoadNode::make(*phase, control, mem, proto_adr, TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
1706 } else {
1707 mark_node = phase->MakeConX(markWord::prototype().value());
1708 }
1709 mark_node = phase->transform(mark_node);
1710 // Avoid returning a constant (old node) here because this method is used by LoadNode::Ideal
1711 return new OrXNode(mark_node, phase->MakeConX(_larval ? markWord::larval_state_pattern : 0));
1712 }
1713
1714
1715 //=============================================================================
1716 Node* AllocateArrayNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1717 Node* res = SafePointNode::Ideal(phase, can_reshape);
1718 if (res != NULL) {
1719 return res;
|
1660 assert(projs->nb_resproj <= 1, "unexpected number of results");
1661 if (projs->fallthrough_catchproj != NULL) {
1662 igvn->replace_node(projs->fallthrough_catchproj, in(TypeFunc::Control));
1663 }
1664 if (projs->fallthrough_memproj != NULL) {
1665 igvn->replace_node(projs->fallthrough_memproj, in(TypeFunc::Memory));
1666 }
1667 if (projs->catchall_memproj != NULL) {
1668 igvn->replace_node(projs->catchall_memproj, phase->C->top());
1669 }
1670 if (projs->fallthrough_ioproj != NULL) {
1671 igvn->replace_node(projs->fallthrough_ioproj, in(TypeFunc::I_O));
1672 }
1673 if (projs->catchall_ioproj != NULL) {
1674 igvn->replace_node(projs->catchall_ioproj, phase->C->top());
1675 }
1676 if (projs->catchall_catchproj != NULL) {
1677 igvn->replace_node(projs->catchall_catchproj, phase->C->top());
1678 }
1679 if (projs->resproj[0] != NULL) {
1680 // Remove MemBarStoreStore user as well
1681 for (DUIterator_Fast imax, i = projs->resproj[0]->fast_outs(imax); i < imax; i++) {
1682 MemBarStoreStoreNode* mb = projs->resproj[0]->fast_out(i)->isa_MemBarStoreStore();
1683 if (mb != NULL && mb->outcnt() == 2) {
1684 mb->remove(igvn);
1685 --i; --imax;
1686 }
1687 }
1688 igvn->replace_node(projs->resproj[0], phase->C->top());
1689 }
1690 igvn->replace_node(this, phase->C->top());
1691 if (init != NULL) {
1692 Node* ctrl_proj = init->proj_out_or_null(TypeFunc::Control);
1693 Node* mem_proj = init->proj_out_or_null(TypeFunc::Memory);
1694 if (ctrl_proj != NULL) {
1695 igvn->replace_node(ctrl_proj, init->in(TypeFunc::Control));
1696 }
1697 if (mem_proj != NULL) {
1698 igvn->replace_node(mem_proj, init->in(TypeFunc::Memory));
1699 }
1700 }
1701 return NULL;
1702 }
1703
1704 return CallNode::Ideal(phase, can_reshape);
1705 }
1706
1707 Node* AllocateNode::make_ideal_mark(PhaseGVN* phase, Node* control, Node* mem) {
1708 Node* mark_node = NULL;
1709 // For now only enable fast locking for non-array types
1710 if ((EnableValhalla || UseBiasedLocking) && Opcode() == Op_Allocate) {
1711 Node* klass_node = in(AllocateNode::KlassNode);
1712 Node* proto_adr = phase->transform(new AddPNode(klass_node, klass_node, phase->MakeConX(in_bytes(Klass::prototype_header_offset()))));
1713 mark_node = LoadNode::make(*phase, control, mem, proto_adr, TypeRawPtr::BOTTOM, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
1714 } else {
1715 mark_node = phase->MakeConX(markWord::prototype().value());
1716 }
1717 mark_node = phase->transform(mark_node);
1718 // Avoid returning a constant (old node) here because this method is used by LoadNode::Ideal
1719 return new OrXNode(mark_node, phase->MakeConX(_larval ? markWord::larval_state_pattern : 0));
1720 }
1721
1722
1723 //=============================================================================
1724 Node* AllocateArrayNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1725 Node* res = SafePointNode::Ideal(phase, can_reshape);
1726 if (res != NULL) {
1727 return res;
|