1091 Node* dest_offset = ac->in(ArrayCopyNode::DestPos); |
1091 Node* dest_offset = ac->in(ArrayCopyNode::DestPos); |
1092 Node* length = ac->in(ArrayCopyNode::Length); |
1092 Node* length = ac->in(ArrayCopyNode::Length); |
1093 MergeMemNode* merge_mem = NULL; |
1093 MergeMemNode* merge_mem = NULL; |
1094 |
1094 |
1095 if (ac->is_clonebasic()) { |
1095 if (ac->is_clonebasic()) { |
1096 assert (src_offset == NULL && dest_offset == NULL, "for clone offsets should be null"); |
|
1097 Node* mem = ac->in(TypeFunc::Memory); |
|
1098 const char* copyfunc_name = "arraycopy"; |
|
1099 address copyfunc_addr = |
|
1100 basictype2arraycopy(T_LONG, NULL, NULL, |
|
1101 true, copyfunc_name, true); |
|
1102 |
|
1103 const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM; |
|
1104 const TypeFunc* call_type = OptoRuntime::fast_arraycopy_Type(); |
|
1105 |
|
1106 Node* call = make_leaf_call(ctrl, mem, call_type, copyfunc_addr, copyfunc_name, raw_adr_type, src, dest, length XTOP); |
|
1107 transform_later(call); |
|
1108 |
|
1109 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); |
1096 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); |
1110 bs->clone_barrier_at_expansion(ac, call, _igvn); |
1097 bs->clone_at_expansion(this, ac); |
1111 |
|
1112 return; |
1098 return; |
1113 } else if (ac->is_copyof() || ac->is_copyofrange() || ac->is_cloneoop()) { |
1099 } else if (ac->is_copyof() || ac->is_copyofrange() || ac->is_cloneoop()) { |
1114 Node* mem = ac->in(TypeFunc::Memory); |
1100 Node* mem = ac->in(TypeFunc::Memory); |
1115 merge_mem = MergeMemNode::make(mem); |
1101 merge_mem = MergeMemNode::make(mem); |
1116 transform_later(merge_mem); |
1102 transform_later(merge_mem); |