< prev index next >

src/share/vm/opto/shenandoahSupport.cpp

Print this page
rev 10526 : [backport] Perform gc-state checks with LoadB to fit C2 matchers
rev 10541 : [backport] Make in-cset checks use signed bytes to match C2 better
rev 10585 : [backport] Handle missing ShenandoahWriteBarrierRB case
rev 10589 : [backport] Purge support for ShenandoahConcurrentEvacCodeRoots and ShenandoahBarriersForConst

*** 102,112 **** // tty->print_cr("killed barrier for NULL object"); return false; } if (type->make_oopptr() && type->make_oopptr()->const_oop() != NULL) { // tty->print_cr("killed barrier for constant object"); ! return ShenandoahBarriersForConst; } if (ShenandoahOptimizeStableFinals) { const TypeAryPtr* ary = type->isa_aryptr(); if (ary && ary->is_stable() && allow_fromspace) { --- 102,112 ---- // tty->print_cr("killed barrier for NULL object"); return false; } if (type->make_oopptr() && type->make_oopptr()->const_oop() != NULL) { // tty->print_cr("killed barrier for constant object"); ! return false; } if (ShenandoahOptimizeStableFinals) { const TypeAryPtr* ary = type->isa_aryptr(); if (ary && ary->is_stable() && allow_fromspace) {
*** 778,788 **** continue; } else if (in->is_AddP()) { assert(!in->in(AddPNode::Address)->is_top(), "no raw memory access"); in = in->in(AddPNode::Address); continue; ! } else if (in->is_Con() && !ShenandoahBarriersForConst) { if (trace) {tty->print("Found constant"); in->dump();} } else if (in->is_ShenandoahBarrier()) { if (t == ShenandoahStore && in->Opcode() != Op_ShenandoahWriteBarrier) { return false; } --- 778,788 ---- continue; } else if (in->is_AddP()) { assert(!in->in(AddPNode::Address)->is_top(), "no raw memory access"); in = in->in(AddPNode::Address); continue; ! } else if (in->is_Con()) { if (trace) {tty->print("Found constant"); in->dump();} } else if (in->is_ShenandoahBarrier()) { if (t == ShenandoahStore && in->Opcode() != Op_ShenandoahWriteBarrier) { return false; }
*** 2286,2372 **** } return NULL; } - const TypePtr* ShenandoahBarrierNode::fix_addp_type(const TypePtr* res, Node* base) { - if (UseShenandoahGC && ShenandoahBarriersForConst) { - // With barriers on constant oops, if a field being accessed is a - // static field, correct alias analysis requires that we look - // beyond the barriers (that hide the constant) to find the actual - // java class mirror constant. - const TypeInstPtr* ti = res->isa_instptr(); - if (ti != NULL && - ti->const_oop() == NULL && - ti->klass() == ciEnv::current()->Class_klass() && - ti->offset() >= (ti->klass()->as_instance_klass()->size_helper() * wordSize)) { - ResourceMark rm; - Unique_Node_List wq; - ciObject* const_oop = NULL; - wq.push(base); - for (uint i = 0; i < wq.size(); i++) { - Node *n = wq.at(i); - if (n->is_ShenandoahBarrier() || - (n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_ShenandoahReadBarrier)) { - Node* m = n->in(ShenandoahBarrierNode::ValueIn); - if (m != NULL) { - wq.push(m); - } - } else if (n->is_Phi()) { - for (uint j = 1; j < n->req(); j++) { - Node* m = n->in(j); - if (m != NULL) { - wq.push(m); - } - } - } else if (n->is_ConstraintCast() || (n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_CheckCastPP)) { - Node* m = n->in(1); - if (m != NULL) { - wq.push(m); - } - } else { - const TypeInstPtr* tn = n->bottom_type()->isa_instptr(); - if (tn != NULL) { - if (tn->const_oop() != NULL) { - if (const_oop == NULL) { - const_oop = tn->const_oop(); - } else if (const_oop != tn->const_oop()) { - const_oop = NULL; - break; - } - } else { - if (n->is_Proj()) { - if (n->in(0)->Opcode() == Op_CallLeafNoFP) { - if (n->in(0)->as_Call()->entry_point() != StubRoutines::shenandoah_wb_C()) { - const_oop = NULL; - break; - } - } else if (n->in(0)->is_MachCallLeaf()) { - if (n->in(0)->as_MachCall()->entry_point() != StubRoutines::shenandoah_wb_C()) { - const_oop = NULL; - break; - } - } - } else { - fatal("2 different static fields being accessed with a single AddP"); - const_oop = NULL; - break; - } - } - } else { - assert(n->bottom_type() == Type::TOP, "not an instance ptr?"); - } - } - } - if (const_oop != NULL) { - res = ti->cast_to_const(const_oop); - } - } - } - return res; - } - static void shenandoah_disconnect_barrier_mem(Node* wb, PhaseIterGVN& igvn) { Node* mem_in = wb->in(ShenandoahBarrierNode::Memory); Node* proj = wb->find_out_with(Op_ShenandoahWBMemProj); for (DUIterator_Last imin, i = proj->last_outs(imin); i >= imin; ) { --- 2286,2295 ----
*** 3444,3454 **** bool ShenandoahBarrierNode::is_gc_state_load(Node *n) { if (!UseShenandoahGC) { return false; } ! if (n->Opcode() != Op_LoadUB && n->Opcode() != Op_LoadB) { return false; } Node* addp = n->in(MemNode::Address); if (!addp->is_AddP()) { return false; --- 3367,3377 ---- bool ShenandoahBarrierNode::is_gc_state_load(Node *n) { if (!UseShenandoahGC) { return false; } ! if (n->Opcode() != Op_LoadB) { return false; } Node* addp = n->in(MemNode::Address); if (!addp->is_AddP()) { return false;
*** 3477,3487 **** register_new_node(gc_state_addr, ctrl); uint gc_state_idx = Compile::AliasIdxRaw; const TypePtr* gc_state_adr_type = NULL; // debug-mode-only argument debug_only(gc_state_adr_type = C->get_adr_type(gc_state_idx)); ! Node* gc_state = new (C) LoadUBNode(ctrl, raw_mem, gc_state_addr, gc_state_adr_type, TypeInt::BYTE, MemNode::unordered); register_new_node(gc_state, ctrl); Node* evacuation_in_progress = new (C) AndINode(gc_state, _igvn.intcon(ShenandoahHeap::EVACUATION)); register_new_node(evacuation_in_progress, ctrl); Node* evacuation_in_progress_cmp = new (C) CmpINode(evacuation_in_progress, _igvn.zerocon(T_INT)); --- 3400,3410 ---- register_new_node(gc_state_addr, ctrl); uint gc_state_idx = Compile::AliasIdxRaw; const TypePtr* gc_state_adr_type = NULL; // debug-mode-only argument debug_only(gc_state_adr_type = C->get_adr_type(gc_state_idx)); ! Node* gc_state = new (C) LoadBNode(ctrl, raw_mem, gc_state_addr, gc_state_adr_type, TypeInt::BYTE, MemNode::unordered); register_new_node(gc_state, ctrl); Node* evacuation_in_progress = new (C) AndINode(gc_state, _igvn.intcon(ShenandoahHeap::EVACUATION)); register_new_node(evacuation_in_progress, ctrl); Node* evacuation_in_progress_cmp = new (C) CmpINode(evacuation_in_progress, _igvn.zerocon(T_INT));
*** 3626,3636 **** Node* in_cset_fast_test_adr = new (C) AddPNode(C->top(), in_cset_fast_test_base_addr, cset_offset); register_new_node(in_cset_fast_test_adr, c); uint in_cset_fast_test_idx = Compile::AliasIdxRaw; const TypePtr* in_cset_fast_test_adr_type = NULL; // debug-mode-only argument debug_only(in_cset_fast_test_adr_type = C->get_adr_type(in_cset_fast_test_idx)); ! Node* in_cset_fast_test_load = new (C) LoadUBNode(c, raw_mem, in_cset_fast_test_adr, in_cset_fast_test_adr_type, TypeInt::BOOL, MemNode::unordered); register_new_node(in_cset_fast_test_load, c); Node* in_cset_fast_test_cmp = new (C) CmpINode(in_cset_fast_test_load, _igvn.zerocon(T_INT)); register_new_node(in_cset_fast_test_cmp, c); Node* in_cset_fast_test_test = new (C) BoolNode(in_cset_fast_test_cmp, BoolTest::ne); register_new_node(in_cset_fast_test_test, c); --- 3549,3559 ---- Node* in_cset_fast_test_adr = new (C) AddPNode(C->top(), in_cset_fast_test_base_addr, cset_offset); register_new_node(in_cset_fast_test_adr, c); uint in_cset_fast_test_idx = Compile::AliasIdxRaw; const TypePtr* in_cset_fast_test_adr_type = NULL; // debug-mode-only argument debug_only(in_cset_fast_test_adr_type = C->get_adr_type(in_cset_fast_test_idx)); ! Node* in_cset_fast_test_load = new (C) LoadBNode(c, raw_mem, in_cset_fast_test_adr, in_cset_fast_test_adr_type, TypeInt::BOOL, MemNode::unordered); register_new_node(in_cset_fast_test_load, c); Node* in_cset_fast_test_cmp = new (C) CmpINode(in_cset_fast_test_load, _igvn.zerocon(T_INT)); register_new_node(in_cset_fast_test_cmp, c); Node* in_cset_fast_test_test = new (C) BoolNode(in_cset_fast_test_cmp, BoolTest::ne); register_new_node(in_cset_fast_test_test, c);
*** 3656,3667 **** Node* raw_mem, Node* wb_mem, Node* region, Node* val_phi, Node* mem_phi, Node* raw_mem_phi, Node* unc_region, int alias, Unique_Node_List& uses) { shenandoah_evacuation_in_progress_null_check(c, val, evacuation_iff, unc, unc_ctrl, unc_region, uses); IdealLoopTree *loop = get_loop(c); ! Node* rbtrue = new (C) ShenandoahReadBarrierNode(c, wb_mem, val); register_new_node(rbtrue, c); Node* in_cset_fast_test_failure = NULL; shenandoah_in_cset_fast_test(c, rbtrue, raw_mem, wb_mem, region, val_phi, mem_phi, raw_mem_phi); // The slow path stub consumes and produces raw memory in addition --- 3579,3596 ---- Node* raw_mem, Node* wb_mem, Node* region, Node* val_phi, Node* mem_phi, Node* raw_mem_phi, Node* unc_region, int alias, Unique_Node_List& uses) { shenandoah_evacuation_in_progress_null_check(c, val, evacuation_iff, unc, unc_ctrl, unc_region, uses); IdealLoopTree *loop = get_loop(c); ! ! Node* rbtrue; ! if (ShenandoahWriteBarrierRB) { ! rbtrue = new (C) ShenandoahReadBarrierNode(c, wb_mem, val); register_new_node(rbtrue, c); + } else { + rbtrue = val; + } Node* in_cset_fast_test_failure = NULL; shenandoah_in_cset_fast_test(c, rbtrue, raw_mem, wb_mem, region, val_phi, mem_phi, raw_mem_phi); // The slow path stub consumes and produces raw memory in addition
< prev index next >