< prev index next >

src/hotspot/share/opto/compile.cpp

Print this page
rev 53307 : Backport Shenadoah GC

*** 80,89 **** --- 80,92 ---- #include "gc/g1/g1ThreadLocalData.hpp" #endif // INCLUDE_G1GC #if INCLUDE_ZGC #include "gc/z/c2/zBarrierSetC2.hpp" #endif + #if INCLUDE_SHENANDOAHGC + #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp" + #endif // -------------------- Compile::mach_constant_base_node ----------------------- // Constant table base node singleton. MachConstantBaseNode* Compile::mach_constant_base_node() {
*** 2417,2426 **** --- 2420,2438 ---- assert(failing(), "must bail out w/ explicit message"); return; } } + print_method(PHASE_BEFORE_BARRIER_EXPAND, 2); + + #if INCLUDE_SHENANDOAHGC + if (UseShenandoahGC && ((ShenandoahBarrierSetC2*)BarrierSet::barrier_set()->barrier_set_c2())->expand_barriers(this, igvn)) { + assert(failing(), "must bail out w/ explicit message"); + return; + } + #endif + if (opaque4_count() > 0) { C->remove_opaque4_nodes(igvn); igvn.optimize(); }
*** 2857,2866 **** --- 2869,2889 ---- case Op_CallRuntime: case Op_CallLeaf: case Op_CallLeafNoFP: { assert (n->is_Call(), ""); CallNode *call = n->as_Call(); + #if INCLUDE_SHENANDOAHGC + if (UseShenandoahGC && ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(call)) { + uint cnt = ShenandoahBarrierSetC2::write_ref_field_pre_entry_Type()->domain()->cnt(); + if (call->req() > cnt) { + assert(call->req() == cnt+1, "only one extra input"); + Node* addp = call->in(cnt); + assert(!ShenandoahBarrierSetC2::has_only_shenandoah_wb_pre_uses(addp), "useless address computation?"); + call->del_req(cnt); + } + } + #endif // Count call sites where the FP mode bit would have to be flipped. // Do not count uncommon runtime calls: // uncommon_trap, _complete_monitor_locking, _complete_monitor_unlocking, // _new_Java, _new_typeArray, _new_objArray, _rethrow_Java, ... if (!call->is_CallStaticJava() || !call->as_CallStaticJava()->_name) {
*** 3423,3432 **** --- 3446,3477 ---- } } } break; } + #if INCLUDE_SHENANDOAHGC + case Op_ShenandoahCompareAndSwapP: + case Op_ShenandoahCompareAndSwapN: + case Op_ShenandoahWeakCompareAndSwapN: + case Op_ShenandoahWeakCompareAndSwapP: + case Op_ShenandoahCompareAndExchangeP: + case Op_ShenandoahCompareAndExchangeN: + #ifdef ASSERT + if( VerifyOptoOopOffsets ) { + MemNode* mem = n->as_Mem(); + // Check to see if address types have grounded out somehow. + const TypeInstPtr *tp = mem->in(MemNode::Address)->bottom_type()->isa_instptr(); + ciInstanceKlass *k = tp->klass()->as_instance_klass(); + bool oop_offset_is_sane = k->contains_field_offset(tp->offset()); + assert( !tp || oop_offset_is_sane, "" ); + } + #endif + break; + case Op_ShenandoahLoadReferenceBarrier: + assert(false, "should have been expanded already"); + break; + #endif case Op_RangeCheck: { RangeCheckNode* rc = n->as_RangeCheck(); Node* iff = new IfNode(rc->in(0), rc->in(1), rc->_prob, rc->_fcnt); n->subsume_by(iff, this); frc._tests.push(iff);
*** 3859,3872 **** // Verify GC barriers consistency // Currently supported: // - G1 pre-barriers (see GraphKit::g1_write_barrier_pre()) void Compile::verify_barriers() { ! #if INCLUDE_G1GC ! if (UseG1GC) { // Verify G1 pre-barriers const int marking_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()); ResourceArea *area = Thread::current()->resource_area(); Unique_Node_List visited(area); Node_List worklist(area); // We're going to walk control flow backwards starting from the Root --- 3904,3925 ---- // Verify GC barriers consistency // Currently supported: // - G1 pre-barriers (see GraphKit::g1_write_barrier_pre()) void Compile::verify_barriers() { ! #if INCLUDE_G1GC || INCLUDE_SHENANDOAHGC ! if (UseG1GC || UseShenandoahGC) { // Verify G1 pre-barriers + + #if INCLUDE_G1GC && INCLUDE_SHENANDOAHGC + const int marking_offset = in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_active_offset() + : ShenandoahThreadLocalData::satb_mark_queue_active_offset()); + #elif INCLUDE_G1GC const int marking_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()); + #else + const int marking_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()); + #endif ResourceArea *area = Thread::current()->resource_area(); Unique_Node_List visited(area); Node_List worklist(area); // We're going to walk control flow backwards starting from the Root
< prev index next >