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); |