208 if (!finish_transform(phase, can_reshape, ctl, mem)) {
209 // Return NodeSentinel to indicate that the transform failed
210 return NodeSentinel;
211 }
212
213 return mem;
214 }
215
216 bool ArrayCopyNode::prepare_array_copy(PhaseGVN *phase, bool can_reshape,
217 Node*& adr_src,
218 Node*& base_src,
219 Node*& adr_dest,
220 Node*& base_dest,
221 BasicType& copy_type,
222 const Type*& value_type,
223 bool& disjoint_bases) {
224 Node* src = in(ArrayCopyNode::Src);
225 Node* dest = in(ArrayCopyNode::Dest);
226 const Type* src_type = phase->type(src);
227 const TypeAryPtr* ary_src = src_type->isa_aryptr();
228 assert(ary_src != NULL, "should be an array copy/clone");
229
230 if (is_arraycopy() || is_copyofrange() || is_copyof()) {
231 const Type* dest_type = phase->type(dest);
232 const TypeAryPtr* ary_dest = dest_type->isa_aryptr();
233 Node* src_offset = in(ArrayCopyNode::SrcPos);
234 Node* dest_offset = in(ArrayCopyNode::DestPos);
235
236 // newly allocated object is guaranteed to not overlap with source object
237 disjoint_bases = is_alloc_tightly_coupled();
238
239 if (ary_src == NULL || ary_src->klass() == NULL ||
240 ary_dest == NULL || ary_dest->klass() == NULL) {
241 // We don't know if arguments are arrays
242 return false;
243 }
244
245 BasicType src_elem = ary_src->klass()->as_array_klass()->element_type()->basic_type();
246 BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type();
247 if (src_elem == T_ARRAY) src_elem = T_OBJECT;
248 if (dest_elem == T_ARRAY) dest_elem = T_OBJECT;
|
208 if (!finish_transform(phase, can_reshape, ctl, mem)) {
209 // Return NodeSentinel to indicate that the transform failed
210 return NodeSentinel;
211 }
212
213 return mem;
214 }
215
216 bool ArrayCopyNode::prepare_array_copy(PhaseGVN *phase, bool can_reshape,
217 Node*& adr_src,
218 Node*& base_src,
219 Node*& adr_dest,
220 Node*& base_dest,
221 BasicType& copy_type,
222 const Type*& value_type,
223 bool& disjoint_bases) {
224 Node* src = in(ArrayCopyNode::Src);
225 Node* dest = in(ArrayCopyNode::Dest);
226 const Type* src_type = phase->type(src);
227 const TypeAryPtr* ary_src = src_type->isa_aryptr();
228
229 if (is_arraycopy() || is_copyofrange() || is_copyof()) {
230 const Type* dest_type = phase->type(dest);
231 const TypeAryPtr* ary_dest = dest_type->isa_aryptr();
232 Node* src_offset = in(ArrayCopyNode::SrcPos);
233 Node* dest_offset = in(ArrayCopyNode::DestPos);
234
235 // newly allocated object is guaranteed to not overlap with source object
236 disjoint_bases = is_alloc_tightly_coupled();
237
238 if (ary_src == NULL || ary_src->klass() == NULL ||
239 ary_dest == NULL || ary_dest->klass() == NULL) {
240 // We don't know if arguments are arrays
241 return false;
242 }
243
244 BasicType src_elem = ary_src->klass()->as_array_klass()->element_type()->basic_type();
245 BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type();
246 if (src_elem == T_ARRAY) src_elem = T_OBJECT;
247 if (dest_elem == T_ARRAY) dest_elem = T_OBJECT;
|