< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page

        

*** 48,57 **** --- 48,60 ---- #include "utilities/macros.hpp" #include "utilities/vmError.hpp" #if INCLUDE_ZGC #include "gc/z/c2/zBarrierSetC2.hpp" #endif + #if INCLUDE_SHENANDOAHGC + #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp" + #endif // Portions of code courtesy of Clifford Click // Optimization - Graph Style
*** 951,962 **** LoadNode* ld = clone()->as_Load(); Node* addp = in(MemNode::Address)->clone(); if (ac->as_ArrayCopy()->is_clonebasic()) { assert(ld_alloc != NULL, "need an alloc"); assert(addp->is_AddP(), "address must be addp"); ! assert(addp->in(AddPNode::Base) == ac->in(ArrayCopyNode::Dest)->in(AddPNode::Base), "strange pattern"); ! assert(addp->in(AddPNode::Address) == ac->in(ArrayCopyNode::Dest)->in(AddPNode::Address), "strange pattern"); addp->set_req(AddPNode::Base, src->in(AddPNode::Base)); addp->set_req(AddPNode::Address, src->in(AddPNode::Address)); } else { assert(ac->as_ArrayCopy()->is_arraycopy_validated() || ac->as_ArrayCopy()->is_copyof_validated() || --- 954,972 ---- LoadNode* ld = clone()->as_Load(); Node* addp = in(MemNode::Address)->clone(); if (ac->as_ArrayCopy()->is_clonebasic()) { assert(ld_alloc != NULL, "need an alloc"); assert(addp->is_AddP(), "address must be addp"); ! assert(ac->in(ArrayCopyNode::Dest)->is_AddP(), "dest must be an address"); ! #if INCLUDE_SHENANDOAHGC ! if (UseShenandoahGC) { ! assert(((ShenandoahBarrierSetC2*)BarrierSet::barrier_set()->barrier_set_c2())->step_over_gc_barrier(addp->in(AddPNode::Base)) == ! ((ShenandoahBarrierSetC2*)BarrierSet::barrier_set()->barrier_set_c2())->step_over_gc_barrier(ac->in(ArrayCopyNode::Dest)->in(AddPNode::Base)), "strange pattern"); ! assert(((ShenandoahBarrierSetC2*)BarrierSet::barrier_set()->barrier_set_c2())->step_over_gc_barrier(addp->in(AddPNode::Address)) == ! ((ShenandoahBarrierSetC2*)BarrierSet::barrier_set()->barrier_set_c2())->step_over_gc_barrier(ac->in(ArrayCopyNode::Dest)->in(AddPNode::Address)), "strange pattern"); ! } ! #endif addp->set_req(AddPNode::Base, src->in(AddPNode::Base)); addp->set_req(AddPNode::Address, src->in(AddPNode::Address)); } else { assert(ac->as_ArrayCopy()->is_arraycopy_validated() || ac->as_ArrayCopy()->is_copyof_validated() ||
*** 1108,1117 **** --- 1118,1132 ---- // Load boxed value from result of valueOf() call is input parameter. if (this->is_Load() && ld_adr->is_AddP() && (tp != NULL) && tp->is_ptr_to_boxed_value()) { intptr_t ignore = 0; Node* base = AddPNode::Ideal_base_and_offset(ld_adr, phase, ignore); + #if INCLUDE_SHENANDOAHGC + if (UseShenandoahGC) { + base = ((ShenandoahBarrierSetC2*) BarrierSet::barrier_set()->barrier_set_c2())->step_over_gc_barrier(base); + } + #endif if (base != NULL && base->is_Proj() && base->as_Proj()->_con == TypeFunc::Parms && base->in(0)->is_CallStaticJava() && base->in(0)->as_CallStaticJava()->is_boxing_method()) { return base->in(0)->in(TypeFunc::Parms);
*** 1435,1445 **** // Split through Phi (see original code in loopopts.cpp). assert(C->have_alias_type(t_oop), "instance should have alias type"); // Do nothing here if Identity will find a value // (to avoid infinite chain of value phis generation). ! if (!phase->eqv(this, this->Identity(phase))) return NULL; // Select Region to split through. Node* region; if (!base_is_phi) { --- 1450,1460 ---- // Split through Phi (see original code in loopopts.cpp). assert(C->have_alias_type(t_oop), "instance should have alias type"); // Do nothing here if Identity will find a value // (to avoid infinite chain of value phis generation). ! if (!phase->eqv(this, phase->apply_identity(this))) return NULL; // Select Region to split through. Node* region; if (!base_is_phi) {
*** 1525,1535 **** igvn->set_type(x, t); // If x is a TypeNode, capture any more-precise type permanently into Node // otherwise it will be not updated during igvn->transform since // igvn->type(x) is set to x->Value() already. x->raise_bottom_type(t); ! Node *y = x->Identity(igvn); if (y != x) { x = y; } else { y = igvn->hash_find_insert(x); if (y) { --- 1540,1550 ---- igvn->set_type(x, t); // If x is a TypeNode, capture any more-precise type permanently into Node // otherwise it will be not updated during igvn->transform since // igvn->type(x) is set to x->Value() already. x->raise_bottom_type(t); ! Node *y = igvn->apply_identity(x); if (y != x) { x = y; } else { y = igvn->hash_find_insert(x); if (y) {
< prev index next >