src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp
changeset 58339 c7d9df2e470c
parent 58273 08a5148e7c4e
child 58405 752bf4d5fbb7
equal deleted inserted replaced
58338:faf791c5a710 58339:c7d9df2e470c
   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   }