459 |
459 |
460 return TypeFunc::make(domain, range); |
460 return TypeFunc::make(domain, range); |
461 } |
461 } |
462 |
462 |
463 const TypeFunc* ShenandoahBarrierSetC2::shenandoah_clone_barrier_Type() { |
463 const TypeFunc* ShenandoahBarrierSetC2::shenandoah_clone_barrier_Type() { |
464 const Type **fields = TypeTuple::fields(3); |
464 const Type **fields = TypeTuple::fields(4); |
465 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // src |
465 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // src oop |
466 fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL; // dst |
466 fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // src |
467 fields[TypeFunc::Parms+2] = TypeInt::INT; // length |
467 fields[TypeFunc::Parms+2] = TypeRawPtr::NOTNULL; // dst |
468 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+3, fields); |
468 fields[TypeFunc::Parms+3] = TypeInt::INT; // length |
|
469 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+4, fields); |
469 |
470 |
470 // create result type (range) |
471 // create result type (range) |
471 fields = TypeTuple::fields(0); |
472 fields = TypeTuple::fields(0); |
472 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields); |
473 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields); |
473 |
474 |
805 Node* src_offset = ac->in(ArrayCopyNode::SrcPos); |
806 Node* src_offset = ac->in(ArrayCopyNode::SrcPos); |
806 Node* dest = ac->in(ArrayCopyNode::Dest); |
807 Node* dest = ac->in(ArrayCopyNode::Dest); |
807 Node* dest_offset = ac->in(ArrayCopyNode::DestPos); |
808 Node* dest_offset = ac->in(ArrayCopyNode::DestPos); |
808 Node* length = ac->in(ArrayCopyNode::Length); |
809 Node* length = ac->in(ArrayCopyNode::Length); |
809 assert (src_offset == NULL && dest_offset == NULL, "for clone offsets should be null"); |
810 assert (src_offset == NULL && dest_offset == NULL, "for clone offsets should be null"); |
|
811 assert (src->is_AddP(), "for clone the src should be the interior ptr"); |
|
812 assert (dest->is_AddP(), "for clone the dst should be the interior ptr"); |
|
813 |
810 if (ShenandoahCloneBarrier && clone_needs_barrier(src, phase->igvn())) { |
814 if (ShenandoahCloneBarrier && clone_needs_barrier(src, phase->igvn())) { |
811 Node* call = phase->make_leaf_call(ctrl, mem, |
815 Node* call = phase->make_leaf_call(ctrl, mem, |
812 ShenandoahBarrierSetC2::shenandoah_clone_barrier_Type(), |
816 ShenandoahBarrierSetC2::shenandoah_clone_barrier_Type(), |
813 CAST_FROM_FN_PTR(address, ShenandoahRuntime::shenandoah_clone_barrier), |
817 CAST_FROM_FN_PTR(address, ShenandoahRuntime::shenandoah_clone_barrier), |
814 "shenandoah_clone", |
818 "shenandoah_clone", |
815 TypeRawPtr::BOTTOM, |
819 TypeRawPtr::BOTTOM, |
816 src, dest, length); |
820 src->in(AddPNode::Base), src, dest, length); |
817 call = phase->transform_later(call); |
821 call = phase->transform_later(call); |
818 phase->igvn().replace_node(ac, call); |
822 phase->igvn().replace_node(ac, call); |
819 } else { |
823 } else { |
820 BarrierSetC2::clone_at_expansion(phase, ac); |
824 BarrierSetC2::clone_at_expansion(phase, ac); |
821 } |
825 } |