< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page

        

*** 42,52 **** --- 42,56 ---- #include "opto/narrowptrnode.hpp" #include "opto/phaseX.hpp" #include "opto/regmask.hpp" #include "utilities/align.hpp" #include "utilities/copy.hpp" + #include "utilities/macros.hpp" #include "utilities/vmError.hpp" + #if INCLUDE_ZGC + #include "gc/z/c2/zBarrierSetC2.hpp" + #endif // Portions of code courtesy of Clifford Click // Optimization - Graph Style
*** 889,898 **** --- 893,910 ---- // Is the value loaded previously stored by an arraycopy? If so return // a load node that reads from the source array so we may be able to // optimize out the ArrayCopy node later. Node* LoadNode::can_see_arraycopy_value(Node* st, PhaseGVN* phase) const { + #if INCLUDE_ZGC + if (UseZGC) { + if (bottom_type()->make_oopptr() != NULL) { + return NULL; + } + } + #endif + Node* ld_adr = in(MemNode::Address); intptr_t ld_off = 0; AllocateNode* ld_alloc = AllocateNode::Ideal_allocation(ld_adr, phase, ld_off); Node* ac = find_previous_arraycopy(phase, ld_alloc, st, true); if (ac != NULL) {
*** 1572,1582 **** } // Is there a dominating load that loads the same value? Leave // anything that is not a load of a field/array element (like // barriers etc.) alone ! if (in(0) != NULL && adr_type() != TypeRawPtr::BOTTOM && can_reshape) { for (DUIterator_Fast imax, i = mem->fast_outs(imax); i < imax; i++) { Node *use = mem->fast_out(i); if (use != this && use->Opcode() == Opcode() && use->in(0) != NULL && --- 1584,1594 ---- } // Is there a dominating load that loads the same value? Leave // anything that is not a load of a field/array element (like // barriers etc.) alone ! if (in(0) != NULL && !adr_type()->isa_rawptr() && can_reshape) { for (DUIterator_Fast imax, i = mem->fast_outs(imax); i < imax; i++) { Node *use = mem->fast_out(i); if (use != this && use->Opcode() == Opcode() && use->in(0) != NULL &&
*** 2966,2975 **** --- 2978,2997 ---- // Don't bother trying to transform a dead node if (in(0) && in(0)->is_top()) { return NULL; } + #if INCLUDE_ZGC + if (UseZGC) { + if (req() == (Precedent+1) && in(MemBarNode::Precedent)->in(0) != NULL && in(MemBarNode::Precedent)->in(0)->is_LoadBarrier()) { + Node* load_node = in(MemBarNode::Precedent)->in(0)->in(LoadBarrierNode::Oop); + set_req(MemBarNode::Precedent, load_node); + return this; + } + } + #endif + bool progress = false; // Eliminate volatile MemBars for scalar replaced objects. if (can_reshape && req() == (Precedent+1)) { bool eliminate = false; int opc = Opcode();
< prev index next >