--- old/src/hotspot/share/opto/escape.cpp 2018-06-08 19:45:29.585524841 +0200 +++ new/src/hotspot/share/opto/escape.cpp 2018-06-08 19:45:29.318513257 +0200 @@ -38,9 +38,13 @@ #include "opto/phaseX.hpp" #include "opto/movenode.hpp" #include "opto/rootnode.hpp" +#include "utilities/macros.hpp" #if INCLUDE_G1GC #include "gc/g1/g1ThreadLocalData.hpp" #endif // INCLUDE_G1GC +#if INCLUDE_ZGC +#include "gc/z/c2/zBarrierSetC2.hpp" +#endif ConnectionGraph::ConnectionGraph(Compile * C, PhaseIterGVN *igvn) : _nodes(C->comp_arena(), C->unique(), C->unique(), NULL), @@ -449,6 +453,10 @@ break; } case Op_LoadP: +#if INCLUDE_ZGC + case Op_LoadBarrierSlowReg: + case Op_LoadBarrierWeakSlowReg: +#endif case Op_LoadN: case Op_LoadPLocked: { add_objload_to_connection_graph(n, delayed_worklist); @@ -483,6 +491,13 @@ add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(0), delayed_worklist); } +#if INCLUDE_ZGC + else if (UseZGC) { + if (n->as_Proj()->_con == LoadBarrierNode::Oop && n->in(0)->is_LoadBarrier()) { + add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(0)->in(LoadBarrierNode::Oop), delayed_worklist); + } + } +#endif break; } case Op_Rethrow: // Exception object escapes @@ -651,6 +666,10 @@ break; } case Op_LoadP: +#if INCLUDE_ZGC + case Op_LoadBarrierSlowReg: + case Op_LoadBarrierWeakSlowReg: +#endif case Op_LoadN: case Op_LoadPLocked: { // Using isa_ptr() instead of isa_oopptr() for LoadP and Phi because @@ -690,6 +709,14 @@ add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(0), NULL); break; } +#if INCLUDE_ZGC + else if (UseZGC) { + if (n->as_Proj()->_con == LoadBarrierNode::Oop && n->in(0)->is_LoadBarrier()) { + add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(0)->in(LoadBarrierNode::Oop), NULL); + break; + } + } +#endif ELSE_FAIL("Op_Proj"); } case Op_Rethrow: // Exception object escapes @@ -3163,7 +3190,8 @@ op == Op_CastP2X || op == Op_StoreCM || op == Op_FastLock || op == Op_AryEq || op == Op_StrComp || op == Op_HasNegatives || op == Op_StrCompressedCopy || op == Op_StrInflatedCopy || - op == Op_StrEquals || op == Op_StrIndexOf || op == Op_StrIndexOfChar)) { + op == Op_StrEquals || op == Op_StrIndexOf || op == Op_StrIndexOfChar || + BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(use))) { n->dump(); use->dump(); assert(false, "EA: missing allocation reference path");