< prev index next >

src/hotspot/share/opto/subnode.cpp

Print this page
rev 52049 : JDK11-only: Use WB-based acmp barrier

*** 892,905 **** return ( r0->_ptr == TypePtr::NotNull && bits1==0 ) ? TypeInt::CC_GT : TypeInt::CC; } else return TypeInt::CC; } ! static inline Node* isa_java_mirror_load_helper(PhaseGVN* phase, Node* n) { // Return the klass node for (indirect load from OopHandle) // LoadP(LoadP(AddP(foo:Klass, #java_mirror))) // or NULL if not matching. if (n->Opcode() != Op_LoadP) return NULL; const TypeInstPtr* tp = phase->type(n)->isa_instptr(); if (!tp || tp->klass() != phase->C->env()->Class_klass()) return NULL; --- 892,910 ---- return ( r0->_ptr == TypePtr::NotNull && bits1==0 ) ? TypeInt::CC_GT : TypeInt::CC; } else return TypeInt::CC; } ! static inline Node* isa_java_mirror_load(PhaseGVN* phase, Node* n) { // Return the klass node for (indirect load from OopHandle) // LoadP(LoadP(AddP(foo:Klass, #java_mirror))) // or NULL if not matching. + + #if INCLUDE_SHENANDOAHGC + n = ShenandoahBarrierNode::skip_through_barrier(n); + #endif + if (n->Opcode() != Op_LoadP) return NULL; const TypeInstPtr* tp = phase->type(n)->isa_instptr(); if (!tp || tp->klass() != phase->C->env()->Class_klass()) return NULL;
*** 916,954 **** // We've found the klass node of a Java mirror load. return k; } - static inline Node* isa_java_mirror_load(PhaseGVN* phase, Node* n) { - if (!UseShenandoahGC) { - if (n->Opcode() == Op_LoadP) { - return isa_java_mirror_load_helper(phase, n); - } - } else { - #if INCLUDE_SHENANDOAHGC - if (n->is_ShenandoahBarrier() && - n->in(ShenandoahBarrierNode::ValueIn)->Opcode() == Op_LoadP) { - // When Shenandoah is enabled acmp is compiled as: - // if (a != b) { - // a = read_barrier(a); - // b = read_barrier(b); - // if (a == b) { - // .. - // } else { - // .. - // } - // } else { - // - // Recognize that pattern here for the second comparison - return isa_java_mirror_load_helper(phase, n->in(ShenandoahBarrierNode::ValueIn)); - } - #endif - } - - return NULL; - } - static inline Node* isa_const_java_mirror(PhaseGVN* phase, Node* n) { // for ConP(Foo.class) return ConP(Foo.klass) // otherwise return NULL if (!n->is_Con()) return NULL; --- 921,930 ----
*** 969,1031 **** // return the ConP(Foo.klass) assert(mirror_type->is_klass(), "mirror_type should represent a Klass*"); return phase->makecon(TypeKlassPtr::make(mirror_type->as_klass())); } - #if INCLUDE_SHENANDOAHGC - bool CmpPNode::shenandoah_optimize_java_mirror_cmp(PhaseGVN *phase, bool can_reshape) { - assert(UseShenandoahGC, "shenandoah only"); - if (in(1)->is_ShenandoahBarrier()) { - // For this pattern: - // if (a != b) { - // a = read_barrier(a); - // b = read_barrier(b); - // if (a == b) { - // .. - // } else { - // .. - // } - // } else { - // - // Change the second test to a.klass == b.klass and replace the - // first compare by that new test if possible. - if (can_reshape) { - for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) { - Node* u = fast_out(i); - if (u->is_Bool()) { - for (DUIterator_Fast jmax, j = u->fast_outs(jmax); j < jmax; j++) { - Node* uu = u->fast_out(j); - if (uu->is_If() && - uu->in(0) != NULL && - uu->in(0)->is_Proj() && - uu->in(0)->in(0)->is_MemBar() && - uu->in(0)->in(0)->in(0) != NULL && - uu->in(0)->in(0)->in(0)->Opcode() == Op_IfTrue) { - Node* iff = uu->in(0)->in(0)->in(0)->in(0); - if (iff->in(1) != NULL && - iff->in(1)->is_Bool() && - iff->in(1)->as_Bool()->_test._test == BoolTest::ne && - iff->in(1)->in(1) != NULL && - iff->in(1)->in(1)->Opcode() == Op_CmpP) { - Node* cmp = iff->in(1)->in(1); - if (in(1)->in(ShenandoahBarrierNode::ValueIn) == cmp->in(1) && - (!in(2)->is_ShenandoahBarrier() || in(2)->in(ShenandoahBarrierNode::ValueIn) == cmp->in(2))) { - PhaseIterGVN* igvn = phase->is_IterGVN(); - igvn->replace_input_of(iff->in(1), 1, this); - return true; - } - } - } - } - } - } - } - } - return false; - } - #endif - //------------------------------Ideal------------------------------------------ // Normalize comparisons between Java mirror loads to compare the klass instead. // // Also check for the case of comparing an unknown klass loaded from the primary // super-type array vs a known klass with no subtypes. This amounts to --- 945,954 ----
*** 1079,1097 **** Node* k1 = isa_java_mirror_load(phase, in(1)); Node* k2 = isa_java_mirror_load(phase, in(2)); Node* conk2 = isa_const_java_mirror(phase, in(2)); if (k1 && (k2 || conk2)) { - if (!UseShenandoahGC SHENANDOAHGC_ONLY(|| shenandoah_optimize_java_mirror_cmp(phase, can_reshape))) { Node* lhs = k1; Node* rhs = (k2 != NULL) ? k2 : conk2; this->set_req(1, lhs); this->set_req(2, rhs); return this; } } - } // Constant pointer on right? const TypeKlassPtr* t2 = phase->type(in(2))->isa_klassptr(); if (t2 == NULL || !t2->klass_is_exact()) return NULL; --- 1002,1018 ----
< prev index next >