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