929 if (n->is_Store()) {
930 #ifdef ASSERT
931 // Verify that there is no dependent MemBarVolatile nodes,
932 // they should be removed during IGVN, see MemBarNode::Ideal().
933 for (DUIterator_Fast pmax, p = n->fast_outs(pmax);
934 p < pmax; p++) {
935 Node* mb = n->fast_out(p);
936 assert(mb->is_Initialize() || !mb->is_MemBar() ||
937 mb->req() <= MemBarNode::Precedent ||
938 mb->in(MemBarNode::Precedent) != n,
939 "MemBarVolatile should be eliminated for non-escaping object");
940 }
941 #endif
942 _igvn.replace_node(n, n->in(MemNode::Memory));
943 } else if (n->is_ArrayCopy()) {
944 // Disconnect ArrayCopy node
945 ArrayCopyNode* ac = n->as_ArrayCopy();
946 assert(ac->is_clonebasic(), "unexpected array copy kind");
947 Node* membar_after = ac->proj_out(TypeFunc::Control)->unique_ctrl_out();
948 disconnect_projections(ac, _igvn);
949 assert(alloc->in(0)->is_Proj() && alloc->in(0)->in(0)->Opcode() == Op_MemBarCPUOrder, "mem barrier expected before allocation");
950 Node* membar_before = alloc->in(0)->in(0);
951 disconnect_projections(membar_before->as_MemBar(), _igvn);
952 if (membar_after->is_MemBar()) {
953 disconnect_projections(membar_after->as_MemBar(), _igvn);
954 }
955 } else {
956 eliminate_gc_barrier(n);
957 }
958 k -= (oc2 - use->outcnt());
959 }
960 _igvn.remove_dead_node(use);
961 } else if (use->is_ArrayCopy()) {
962 // Disconnect ArrayCopy node
963 ArrayCopyNode* ac = use->as_ArrayCopy();
964 assert(ac->is_arraycopy_validated() ||
965 ac->is_copyof_validated() ||
966 ac->is_copyofrange_validated(), "unsupported");
967 CallProjections callprojs;
968 ac->extract_projections(&callprojs, true);
969
970 _igvn.replace_node(callprojs.fallthrough_ioproj, ac->in(TypeFunc::I_O));
|
929 if (n->is_Store()) {
930 #ifdef ASSERT
931 // Verify that there is no dependent MemBarVolatile nodes,
932 // they should be removed during IGVN, see MemBarNode::Ideal().
933 for (DUIterator_Fast pmax, p = n->fast_outs(pmax);
934 p < pmax; p++) {
935 Node* mb = n->fast_out(p);
936 assert(mb->is_Initialize() || !mb->is_MemBar() ||
937 mb->req() <= MemBarNode::Precedent ||
938 mb->in(MemBarNode::Precedent) != n,
939 "MemBarVolatile should be eliminated for non-escaping object");
940 }
941 #endif
942 _igvn.replace_node(n, n->in(MemNode::Memory));
943 } else if (n->is_ArrayCopy()) {
944 // Disconnect ArrayCopy node
945 ArrayCopyNode* ac = n->as_ArrayCopy();
946 assert(ac->is_clonebasic(), "unexpected array copy kind");
947 Node* membar_after = ac->proj_out(TypeFunc::Control)->unique_ctrl_out();
948 disconnect_projections(ac, _igvn);
949 assert(alloc->in(TypeFunc::Memory)->is_Proj() && alloc->in(TypeFunc::Memory)->in(0)->Opcode() == Op_MemBarCPUOrder, "mem barrier expected before allocation");
950 Node* membar_before = alloc->in(TypeFunc::Memory)->in(0);
951 disconnect_projections(membar_before->as_MemBar(), _igvn);
952 if (membar_after->is_MemBar()) {
953 disconnect_projections(membar_after->as_MemBar(), _igvn);
954 }
955 } else {
956 eliminate_gc_barrier(n);
957 }
958 k -= (oc2 - use->outcnt());
959 }
960 _igvn.remove_dead_node(use);
961 } else if (use->is_ArrayCopy()) {
962 // Disconnect ArrayCopy node
963 ArrayCopyNode* ac = use->as_ArrayCopy();
964 assert(ac->is_arraycopy_validated() ||
965 ac->is_copyof_validated() ||
966 ac->is_copyofrange_validated(), "unsupported");
967 CallProjections callprojs;
968 ac->extract_projections(&callprojs, true);
969
970 _igvn.replace_node(callprojs.fallthrough_ioproj, ac->in(TypeFunc::I_O));
|