349 Node* res = NULL; |
349 Node* res = NULL; |
350 if (ac->is_clonebasic()) { |
350 if (ac->is_clonebasic()) { |
351 Node* base = ac->in(ArrayCopyNode::Src)->in(AddPNode::Base); |
351 Node* base = ac->in(ArrayCopyNode::Src)->in(AddPNode::Base); |
352 Node* adr = _igvn.transform(new AddPNode(base, base, MakeConX(offset))); |
352 Node* adr = _igvn.transform(new AddPNode(base, base, MakeConX(offset))); |
353 const TypePtr* adr_type = _igvn.type(base)->is_ptr()->add_offset(offset); |
353 const TypePtr* adr_type = _igvn.type(base)->is_ptr()->add_offset(offset); |
354 res = LoadNode::make(_igvn, ctl, mem, adr, adr_type, type, bt, MemNode::unordered, LoadNode::Pinned); |
354 res = LoadNode::make(_igvn, ctl, mem, adr, adr_type, type, bt, MemNode::unordered, LoadNode::UnknownControl); |
355 } else { |
355 } else { |
356 if (ac->modifies(offset, offset, &_igvn, true)) { |
356 if (ac->modifies(offset, offset, &_igvn, true)) { |
357 assert(ac->in(ArrayCopyNode::Dest) == alloc->result_cast(), "arraycopy destination should be allocation's result"); |
357 assert(ac->in(ArrayCopyNode::Dest) == alloc->result_cast(), "arraycopy destination should be allocation's result"); |
358 uint shift = exact_log2(type2aelembytes(bt)); |
358 uint shift = exact_log2(type2aelembytes(bt)); |
359 Node* diff = _igvn.transform(new SubINode(ac->in(ArrayCopyNode::SrcPos), ac->in(ArrayCopyNode::DestPos))); |
359 Node* diff = _igvn.transform(new SubINode(ac->in(ArrayCopyNode::SrcPos), ac->in(ArrayCopyNode::DestPos))); |
364 |
364 |
365 Node* off = _igvn.transform(new AddXNode(MakeConX(offset), diff)); |
365 Node* off = _igvn.transform(new AddXNode(MakeConX(offset), diff)); |
366 Node* base = ac->in(ArrayCopyNode::Src); |
366 Node* base = ac->in(ArrayCopyNode::Src); |
367 Node* adr = _igvn.transform(new AddPNode(base, base, off)); |
367 Node* adr = _igvn.transform(new AddPNode(base, base, off)); |
368 const TypePtr* adr_type = _igvn.type(base)->is_ptr()->add_offset(offset); |
368 const TypePtr* adr_type = _igvn.type(base)->is_ptr()->add_offset(offset); |
369 res = LoadNode::make(_igvn, ctl, mem, adr, adr_type, type, bt, MemNode::unordered, LoadNode::Pinned); |
369 res = LoadNode::make(_igvn, ctl, mem, adr, adr_type, type, bt, MemNode::unordered, LoadNode::UnknownControl); |
370 } |
370 } |
371 } |
371 } |
372 if (res != NULL) { |
372 if (res != NULL) { |
373 res = _igvn.transform(res); |
373 res = _igvn.transform(res); |
374 if (ftype->isa_narrowoop()) { |
374 if (ftype->isa_narrowoop()) { |