< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 42,52 **** #include "opto/memnode.hpp" #include "opto/mulnode.hpp" #include "opto/narrowptrnode.hpp" #include "opto/phaseX.hpp" #include "opto/regmask.hpp" - #include "opto/rootnode.hpp" #include "utilities/align.hpp" #include "utilities/copy.hpp" #include "utilities/macros.hpp" #include "utilities/vmError.hpp" #if INCLUDE_ZGC --- 42,51 ----
*** 327,354 **** Node *address = in(MemNode::Address); const Type *t_adr = phase->type(address); if (t_adr == Type::TOP) return NodeSentinel; // caller will return NULL - if (can_reshape && is_unsafe_access() && (t_adr == TypePtr::NULL_PTR)) { - // Unsafe off-heap access with zero address. Remove access and other control users - // to not confuse optimizations and add a HaltNode to fail if this is ever executed. - assert(ctl != NULL, "unsafe accesses should be control dependent"); - for (DUIterator_Fast imax, i = ctl->fast_outs(imax); i < imax; i++) { - Node* u = ctl->fast_out(i); - if (u != ctl) { - igvn->rehash_node_delayed(u); - int nb = u->replace_edge(ctl, phase->C->top()); - --i, imax -= nb; - } - } - Node* frame = igvn->transform(new ParmNode(phase->C->start(), TypeFunc::FramePtr)); - Node* halt = igvn->transform(new HaltNode(ctl, frame)); - phase->C->root()->add_req(halt); - return this; - } - if (can_reshape && igvn != NULL && (igvn->_worklist.member(address) || (igvn->_worklist.size() > 0 && t_adr != adr_type())) ) { // The address's base and type may change when the address is processed. // Delay this mem node transformation until the address is processed. --- 326,335 ----
*** 925,934 **** --- 906,923 ---- // 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) {
*** 2820,2831 **** //============================================================================= //----------------------------------LoadStoreNode------------------------------ LoadStoreNode::LoadStoreNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* rt, uint required ) : Node(required), _type(rt), ! _adr_type(at), ! _has_barrier(false) { init_req(MemNode::Control, c ); init_req(MemNode::Memory , mem); init_req(MemNode::Address, adr); init_req(MemNode::ValueIn, val); --- 2809,2819 ---- //============================================================================= //----------------------------------LoadStoreNode------------------------------ LoadStoreNode::LoadStoreNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* rt, uint required ) : Node(required), _type(rt), ! _adr_type(at) { init_req(MemNode::Control, c ); init_req(MemNode::Memory , mem); init_req(MemNode::Address, adr); init_req(MemNode::ValueIn, val);
*** 3115,3124 **** --- 3103,3122 ---- // 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 >