24 |
24 |
25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "opto/arraycopynode.hpp" |
26 #include "opto/arraycopynode.hpp" |
27 #include "opto/graphKit.hpp" |
27 #include "opto/graphKit.hpp" |
28 |
28 |
29 ArrayCopyNode::ArrayCopyNode(Compile* C, bool alloc_tightly_coupled) |
29 ArrayCopyNode::ArrayCopyNode(Compile* C, bool alloc_tightly_coupled, bool has_negative_length_guard) |
30 : CallNode(arraycopy_type(), NULL, TypeRawPtr::BOTTOM), |
30 : CallNode(arraycopy_type(), NULL, TypeRawPtr::BOTTOM), |
31 _alloc_tightly_coupled(alloc_tightly_coupled), |
31 _alloc_tightly_coupled(alloc_tightly_coupled), |
|
32 _has_negative_length_guard(has_negative_length_guard), |
32 _kind(None), |
33 _kind(None), |
33 _arguments_validated(false), |
34 _arguments_validated(false), |
34 _src_type(TypeOopPtr::BOTTOM), |
35 _src_type(TypeOopPtr::BOTTOM), |
35 _dest_type(TypeOopPtr::BOTTOM) { |
36 _dest_type(TypeOopPtr::BOTTOM) { |
36 init_class_id(Class_ArrayCopy); |
37 init_class_id(Class_ArrayCopy); |
43 ArrayCopyNode* ArrayCopyNode::make(GraphKit* kit, bool may_throw, |
44 ArrayCopyNode* ArrayCopyNode::make(GraphKit* kit, bool may_throw, |
44 Node* src, Node* src_offset, |
45 Node* src, Node* src_offset, |
45 Node* dest, Node* dest_offset, |
46 Node* dest, Node* dest_offset, |
46 Node* length, |
47 Node* length, |
47 bool alloc_tightly_coupled, |
48 bool alloc_tightly_coupled, |
|
49 bool has_negative_length_guard, |
48 Node* src_klass, Node* dest_klass, |
50 Node* src_klass, Node* dest_klass, |
49 Node* src_length, Node* dest_length) { |
51 Node* src_length, Node* dest_length) { |
50 |
52 |
51 ArrayCopyNode* ac = new ArrayCopyNode(kit->C, alloc_tightly_coupled); |
53 ArrayCopyNode* ac = new ArrayCopyNode(kit->C, alloc_tightly_coupled, has_negative_length_guard); |
52 Node* prev_mem = kit->set_predefined_input_for_runtime_call(ac); |
54 Node* prev_mem = kit->set_predefined_input_for_runtime_call(ac); |
53 |
55 |
54 ac->init_req(ArrayCopyNode::Src, src); |
56 ac->init_req(ArrayCopyNode::Src, src); |
55 ac->init_req(ArrayCopyNode::SrcPos, src_offset); |
57 ac->init_req(ArrayCopyNode::SrcPos, src_offset); |
56 ac->init_req(ArrayCopyNode::Dest, dest); |
58 ac->init_req(ArrayCopyNode::Dest, dest); |