< prev index next >

src/hotspot/share/opto/arraycopynode.cpp

Print this page




 568          in(ArrayCopyNode::Dest) != NULL &&
 569          in(ArrayCopyNode::Length) != NULL &&
 570          ((in(ArrayCopyNode::SrcPos) != NULL && in(ArrayCopyNode::DestPos) != NULL) ||
 571           is_clonebasic()), "broken inputs");
 572 
 573   if (in(TypeFunc::Control)->is_top() ||
 574       in(TypeFunc::Memory)->is_top() ||
 575       phase->type(in(ArrayCopyNode::Src)) == Type::TOP ||
 576       phase->type(in(ArrayCopyNode::Dest)) == Type::TOP ||
 577       (in(ArrayCopyNode::SrcPos) != NULL && in(ArrayCopyNode::SrcPos)->is_top()) ||
 578       (in(ArrayCopyNode::DestPos) != NULL && in(ArrayCopyNode::DestPos)->is_top())) {
 579     return NULL;
 580   }
 581 
 582   int count = get_count(phase);
 583 
 584   if (count < 0 || count > ArrayCopyLoadStoreMaxElem) {
 585     return NULL;
 586   }
 587 











 588   Node* mem = try_clone_instance(phase, can_reshape, count);
 589   if (mem != NULL) {
 590     return (mem == NodeSentinel) ? NULL : mem;
 591   }
 592 
 593   Node* adr_src = NULL;
 594   Node* base_src = NULL;
 595   Node* adr_dest = NULL;
 596   Node* base_dest = NULL;
 597   BasicType copy_type = T_ILLEGAL;
 598   const Type* value_type = NULL;
 599   bool disjoint_bases = false;
 600 
 601   if (!prepare_array_copy(phase, can_reshape,
 602                           adr_src, base_src, adr_dest, base_dest,
 603                           copy_type, value_type, disjoint_bases)) {
 604     return NULL;
 605   }
 606 
 607   JVMState* new_jvms = NULL;
 608   SafePointNode* new_map = NULL;
 609   if (!is_clonebasic()) {
 610     new_jvms =  jvms()->clone_shallow(phase->C);
 611     new_map = new SafePointNode(req(), new_jvms);
 612     for (uint i = TypeFunc::FramePtr; i < req(); i++) {
 613       new_map->init_req(i, in(i));
 614     }
 615     new_jvms->set_map(new_map);
 616   } else {
 617     new_jvms =  new (phase->C) JVMState(0);
 618     new_map = new SafePointNode(TypeFunc::Parms, new_jvms);
 619     new_jvms->set_map(new_map);
 620   }
 621   new_map->set_control(in(TypeFunc::Control));
 622   new_map->set_memory(MergeMemNode::make(in(TypeFunc::Memory)));
 623   new_map->set_i_o(in(TypeFunc::I_O));
 624 
 625   Node* src = in(ArrayCopyNode::Src);
 626   Node* dest = in(ArrayCopyNode::Dest);
 627   const TypeAryPtr* atp_src = get_address_type(phase, src);
 628   const TypeAryPtr* atp_dest = get_address_type(phase, dest);
 629   uint alias_idx_src = phase->C->get_alias_index(atp_src);
 630   uint alias_idx_dest = phase->C->get_alias_index(atp_dest);
 631 
 632   if (can_reshape) {
 633     assert(!phase->is_IterGVN()->delay_transform(), "cannot delay transforms");
 634     phase->is_IterGVN()->set_delay_transform(true);
 635   }
 636 
 637   GraphKit kit(new_jvms, phase);
 638 
 639   SafePointNode* backward_map = NULL;
 640   SafePointNode* forward_map = NULL;
 641   Node* backward_ctl = phase->C->top();
 642 
 643   array_copy_test_overlap(kit, disjoint_bases, count, backward_ctl);
 644 
 645   {
 646     PreserveJVMState pjvms(&kit);




 568          in(ArrayCopyNode::Dest) != NULL &&
 569          in(ArrayCopyNode::Length) != NULL &&
 570          ((in(ArrayCopyNode::SrcPos) != NULL && in(ArrayCopyNode::DestPos) != NULL) ||
 571           is_clonebasic()), "broken inputs");
 572 
 573   if (in(TypeFunc::Control)->is_top() ||
 574       in(TypeFunc::Memory)->is_top() ||
 575       phase->type(in(ArrayCopyNode::Src)) == Type::TOP ||
 576       phase->type(in(ArrayCopyNode::Dest)) == Type::TOP ||
 577       (in(ArrayCopyNode::SrcPos) != NULL && in(ArrayCopyNode::SrcPos)->is_top()) ||
 578       (in(ArrayCopyNode::DestPos) != NULL && in(ArrayCopyNode::DestPos)->is_top())) {
 579     return NULL;
 580   }
 581 
 582   int count = get_count(phase);
 583 
 584   if (count < 0 || count > ArrayCopyLoadStoreMaxElem) {
 585     return NULL;
 586   }
 587 
 588   Node* src = in(ArrayCopyNode::Src);
 589   Node* dest = in(ArrayCopyNode::Dest);
 590   const Type* src_type = phase->type(src);
 591   const Type* dest_type = phase->type(dest);
 592 
 593   if (src_type->isa_aryptr() && dest_type->isa_instptr()) {
 594     // clone used for load of unknown value type can't be optimized at
 595     // this point
 596     return NULL;
 597   }
 598 
 599   Node* mem = try_clone_instance(phase, can_reshape, count);
 600   if (mem != NULL) {
 601     return (mem == NodeSentinel) ? NULL : mem;
 602   }
 603 
 604   Node* adr_src = NULL;
 605   Node* base_src = NULL;
 606   Node* adr_dest = NULL;
 607   Node* base_dest = NULL;
 608   BasicType copy_type = T_ILLEGAL;
 609   const Type* value_type = NULL;
 610   bool disjoint_bases = false;
 611 
 612   if (!prepare_array_copy(phase, can_reshape,
 613                           adr_src, base_src, adr_dest, base_dest,
 614                           copy_type, value_type, disjoint_bases)) {
 615     return NULL;
 616   }
 617 
 618   JVMState* new_jvms = NULL;
 619   SafePointNode* new_map = NULL;
 620   if (!is_clonebasic()) {
 621     new_jvms =  jvms()->clone_shallow(phase->C);
 622     new_map = new SafePointNode(req(), new_jvms);
 623     for (uint i = TypeFunc::FramePtr; i < req(); i++) {
 624       new_map->init_req(i, in(i));
 625     }
 626     new_jvms->set_map(new_map);
 627   } else {
 628     new_jvms =  new (phase->C) JVMState(0);
 629     new_map = new SafePointNode(TypeFunc::Parms, new_jvms);
 630     new_jvms->set_map(new_map);
 631   }
 632   new_map->set_control(in(TypeFunc::Control));
 633   new_map->set_memory(MergeMemNode::make(in(TypeFunc::Memory)));
 634   new_map->set_i_o(in(TypeFunc::I_O));
 635 


 636   const TypeAryPtr* atp_src = get_address_type(phase, src);
 637   const TypeAryPtr* atp_dest = get_address_type(phase, dest);
 638   uint alias_idx_src = phase->C->get_alias_index(atp_src);
 639   uint alias_idx_dest = phase->C->get_alias_index(atp_dest);
 640 
 641   if (can_reshape) {
 642     assert(!phase->is_IterGVN()->delay_transform(), "cannot delay transforms");
 643     phase->is_IterGVN()->set_delay_transform(true);
 644   }
 645 
 646   GraphKit kit(new_jvms, phase);
 647 
 648   SafePointNode* backward_map = NULL;
 649   SafePointNode* forward_map = NULL;
 650   Node* backward_ctl = phase->C->top();
 651 
 652   array_copy_test_overlap(kit, disjoint_bases, count, backward_ctl);
 653 
 654   {
 655     PreserveJVMState pjvms(&kit);


< prev index next >