< prev index next >

src/hotspot/share/opto/macro.cpp

Print this page
rev 53300 : 8246153: TestEliminateArrayCopy fails with -XX:+StressReflectiveCode
Summary: Use the memory input instead of the control input to find the membar.
Reviewed-by: kvn, neliasso


 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));


< prev index next >