< prev index next >

src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp

Print this page

456     const address copyfunc_addr = phase->basictype2arraycopy(bt, nullptr, nullptr, true, copyfunc_name, true);
457 
458     const TypePtr* const raw_adr_type = TypeRawPtr::BOTTOM;
459     const TypeFunc* const call_type = OptoRuntime::fast_arraycopy_Type();
460 
461     Node* const call = phase->make_leaf_call(ctrl, mem, call_type, copyfunc_addr, copyfunc_name, raw_adr_type, payload_src, payload_dst, length XTOP);
462     phase->transform_later(call);
463 
464     phase->igvn().replace_node(ac, call);
465     return;
466   }
467 
468   // Clone instance or array where 'src' is only known to be an object (ary_ptr
469   // is null). This can happen in bytecode generated dynamically to implement
470   // reflective array clones.
471   clone_in_runtime(phase, ac, ZBarrierSetRuntime::clone_addr(), "ZBarrierSetRuntime::clone");
472 }
473 
474 #undef XTOP
475 
476 void ZBarrierSetC2::elide_dominated_barrier(MachNode* mach) const {
477   mach->set_barrier_data(ZBarrierElided);
478 }
479 
480 void ZBarrierSetC2::analyze_dominating_barriers() const {
481   ResourceMark rm;
482   Compile* const C = Compile::current();
483   PhaseCFG* const cfg = C->cfg();
484 
485   Node_List loads;
486   Node_List load_dominators;
487 
488   Node_List stores;
489   Node_List store_dominators;
490 
491   Node_List atomics;
492   Node_List atomic_dominators;
493 
494   // Step 1 - Find accesses and allocations, and track them in lists
495   for (uint i = 0; i < cfg->number_of_blocks(); ++i) {
496     const Block* const block = cfg->get_block(i);

456     const address copyfunc_addr = phase->basictype2arraycopy(bt, nullptr, nullptr, true, copyfunc_name, true);
457 
458     const TypePtr* const raw_adr_type = TypeRawPtr::BOTTOM;
459     const TypeFunc* const call_type = OptoRuntime::fast_arraycopy_Type();
460 
461     Node* const call = phase->make_leaf_call(ctrl, mem, call_type, copyfunc_addr, copyfunc_name, raw_adr_type, payload_src, payload_dst, length XTOP);
462     phase->transform_later(call);
463 
464     phase->igvn().replace_node(ac, call);
465     return;
466   }
467 
468   // Clone instance or array where 'src' is only known to be an object (ary_ptr
469   // is null). This can happen in bytecode generated dynamically to implement
470   // reflective array clones.
471   clone_in_runtime(phase, ac, ZBarrierSetRuntime::clone_addr(), "ZBarrierSetRuntime::clone");
472 }
473 
474 #undef XTOP
475 
476 void ZBarrierSetC2::elide_dominated_barrier(MachNode* mach, MachNode* dominator) const {
477   mach->set_barrier_data(ZBarrierElided);
478 }
479 
480 void ZBarrierSetC2::analyze_dominating_barriers() const {
481   ResourceMark rm;
482   Compile* const C = Compile::current();
483   PhaseCFG* const cfg = C->cfg();
484 
485   Node_List loads;
486   Node_List load_dominators;
487 
488   Node_List stores;
489   Node_List store_dominators;
490 
491   Node_List atomics;
492   Node_List atomic_dominators;
493 
494   // Step 1 - Find accesses and allocations, and track them in lists
495   for (uint i = 0; i < cfg->number_of_blocks(); ++i) {
496     const Block* const block = cfg->get_block(i);
< prev index next >