93 bool prepare_array_copy(PhaseGVN *phase, bool can_reshape, 94 Node*& adr_src, Node*& base_src, Node*& adr_dest, Node*& base_dest, 95 BasicType& copy_type, const Type*& value_type, bool& disjoint_bases); 96 void array_copy_test_overlap(PhaseGVN *phase, bool can_reshape, 97 bool disjoint_bases, int count, 98 Node*& forward_ctl, Node*& backward_ctl); 99 Node* array_copy_forward(PhaseGVN *phase, bool can_reshape, Node*& ctl, 100 MergeMemNode* mm, 101 const TypePtr* atp_src, const TypePtr* atp_dest, 102 Node* adr_src, Node* base_src, Node* adr_dest, Node* base_dest, 103 BasicType copy_type, const Type* value_type, int count); 104 Node* array_copy_backward(PhaseGVN *phase, bool can_reshape, Node*& ctl, 105 MergeMemNode* mm, 106 const TypePtr* atp_src, const TypePtr* atp_dest, 107 Node* adr_src, Node* base_src, Node* adr_dest, Node* base_dest, 108 BasicType copy_type, const Type* value_type, int count); 109 bool finish_transform(PhaseGVN *phase, bool can_reshape, 110 Node* ctl, Node *mem); 111 static bool may_modify_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase, CallNode*& call); 112 113 public: 114 115 enum { 116 Src = TypeFunc::Parms, 117 SrcPos, 118 Dest, 119 DestPos, 120 Length, 121 SrcLen, 122 DestLen, 123 SrcKlass, 124 DestKlass, 125 ParmLimit 126 }; 127 128 // Results from escape analysis for non escaping inputs 129 const TypeOopPtr* _src_type; 130 const TypeOopPtr* _dest_type; 131 132 static ArrayCopyNode* make(GraphKit* kit, bool may_throw, | 93 bool prepare_array_copy(PhaseGVN *phase, bool can_reshape, 94 Node*& adr_src, Node*& base_src, Node*& adr_dest, Node*& base_dest, 95 BasicType& copy_type, const Type*& value_type, bool& disjoint_bases); 96 void array_copy_test_overlap(PhaseGVN *phase, bool can_reshape, 97 bool disjoint_bases, int count, 98 Node*& forward_ctl, Node*& backward_ctl); 99 Node* array_copy_forward(PhaseGVN *phase, bool can_reshape, Node*& ctl, 100 MergeMemNode* mm, 101 const TypePtr* atp_src, const TypePtr* atp_dest, 102 Node* adr_src, Node* base_src, Node* adr_dest, Node* base_dest, 103 BasicType copy_type, const Type* value_type, int count); 104 Node* array_copy_backward(PhaseGVN *phase, bool can_reshape, Node*& ctl, 105 MergeMemNode* mm, 106 const TypePtr* atp_src, const TypePtr* atp_dest, 107 Node* adr_src, Node* base_src, Node* adr_dest, Node* base_dest, 108 BasicType copy_type, const Type* value_type, int count); 109 bool finish_transform(PhaseGVN *phase, bool can_reshape, 110 Node* ctl, Node *mem); 111 static bool may_modify_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase, CallNode*& call); 112 113 static Node* load(PhaseGVN *phase, Node*& ctl, MergeMemNode* mem, Node* addr, const TypePtr* adr_type, const Type *type, BasicType bt); 114 void store(PhaseGVN *phase, Node*& ctl, MergeMemNode* mem, Node* addr, const TypePtr* adr_type, Node* val, const Type *type, BasicType bt); 115 116 public: 117 118 enum { 119 Src = TypeFunc::Parms, 120 SrcPos, 121 Dest, 122 DestPos, 123 Length, 124 SrcLen, 125 DestLen, 126 SrcKlass, 127 DestKlass, 128 ParmLimit 129 }; 130 131 // Results from escape analysis for non escaping inputs 132 const TypeOopPtr* _src_type; 133 const TypeOopPtr* _dest_type; 134 135 static ArrayCopyNode* make(GraphKit* kit, bool may_throw, |