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);
|