5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "gc/shared/barrierSet.hpp"
26 #include "gc/shared/tlab_globals.hpp"
27 #include "opto/arraycopynode.hpp"
28 #include "oops/objArrayKlass.hpp"
29 #include "opto/convertnode.hpp"
30 #include "opto/vectornode.hpp"
31 #include "opto/graphKit.hpp"
32 #include "opto/macro.hpp"
33 #include "opto/runtime.hpp"
34 #include "opto/castnode.hpp"
35 #include "runtime/stubRoutines.hpp"
36 #include "utilities/align.hpp"
37 #include "utilities/powerOfTwo.hpp"
38
39 void PhaseMacroExpand::insert_mem_bar(Node** ctrl, Node** mem, int opcode, Node* precedent) {
40 MemBarNode* mb = MemBarNode::make(C, opcode, Compile::AliasIdxBot, precedent);
41 mb->init_req(TypeFunc::Control, *ctrl);
42 mb->init_req(TypeFunc::Memory, *mem);
43 transform_later(mb);
44 *ctrl = new ProjNode(mb,TypeFunc::Control);
121 }
122
123 IfNode* iff = new IfNode(*ctrl, test, true_prob, COUNT_UNKNOWN);
124 transform_later(iff);
125
126 Node* if_slow = new IfTrueNode(iff);
127 transform_later(if_slow);
128
129 if (region != nullptr) {
130 region->add_req(if_slow);
131 }
132
133 Node* if_fast = new IfFalseNode(iff);
134 transform_later(if_fast);
135
136 *ctrl = if_fast;
137
138 return if_slow;
139 }
140
141 inline Node* PhaseMacroExpand::generate_slow_guard(Node** ctrl, Node* test, RegionNode* region) {
142 return generate_guard(ctrl, test, region, PROB_UNLIKELY_MAG(3));
143 }
144
145 void PhaseMacroExpand::generate_negative_guard(Node** ctrl, Node* index, RegionNode* region) {
146 if ((*ctrl)->is_top())
147 return; // already stopped
148 if (_igvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
149 return; // index is already adequately typed
150 Node* cmp_lt = new CmpINode(index, intcon(0));
151 transform_later(cmp_lt);
152 Node* bol_lt = new BoolNode(cmp_lt, BoolTest::lt);
153 transform_later(bol_lt);
154 generate_guard(ctrl, bol_lt, region, PROB_MIN);
155 }
156
157 void PhaseMacroExpand::generate_limit_guard(Node** ctrl, Node* offset, Node* subseq_length, Node* array_length, RegionNode* region) {
158 if ((*ctrl)->is_top())
159 return; // already stopped
160 bool zero_offset = _igvn.type(offset) == TypeInt::ZERO;
161 if (zero_offset && subseq_length->eqv_uncast(array_length))
162 return; // common case of whole-array copy
163 Node* last = subseq_length;
164 if (!zero_offset) { // last += offset
265
266 *ctrl = stub_block;
267 }
268
269
270 Node* PhaseMacroExpand::generate_nonpositive_guard(Node** ctrl, Node* index, bool never_negative) {
271 if ((*ctrl)->is_top()) return nullptr;
272
273 if (_igvn.type(index)->higher_equal(TypeInt::POS1)) // [1,maxint]
274 return nullptr; // index is already adequately typed
275 Node* cmp_le = new CmpINode(index, intcon(0));
276 transform_later(cmp_le);
277 BoolTest::mask le_or_eq = (never_negative ? BoolTest::eq : BoolTest::le);
278 Node* bol_le = new BoolNode(cmp_le, le_or_eq);
279 transform_later(bol_le);
280 Node* is_notp = generate_guard(ctrl, bol_le, nullptr, PROB_MIN);
281
282 return is_notp;
283 }
284
285 void PhaseMacroExpand::finish_arraycopy_call(Node* call, Node** ctrl, MergeMemNode** mem, const TypePtr* adr_type) {
286 transform_later(call);
287
288 *ctrl = new ProjNode(call,TypeFunc::Control);
289 transform_later(*ctrl);
290 Node* newmem = new ProjNode(call, TypeFunc::Memory);
291 transform_later(newmem);
292
293 uint alias_idx = C->get_alias_index(adr_type);
294 if (alias_idx != Compile::AliasIdxBot) {
295 *mem = MergeMemNode::make(*mem);
296 (*mem)->set_memory_at(alias_idx, newmem);
297 } else {
298 *mem = MergeMemNode::make(newmem);
299 }
300 transform_later(*mem);
301 }
302
303 address PhaseMacroExpand::basictype2arraycopy(BasicType t,
304 Node* src_offset,
359 // }
360 // }
361 // // adjust params for remaining work:
362 // if (slowval != -1) {
363 // n = -1^slowval; src_offset += n; dest_offset += n; length -= n
364 // }
365 // slow_region:
366 // call slow arraycopy(src, src_offset, dest, dest_offset, length)
367 // return // via slow_call_path
368 //
369 // This routine is used from several intrinsics: System.arraycopy,
370 // Object.clone (the array subcase), and Arrays.copyOf[Range].
371 //
372 Node* PhaseMacroExpand::generate_arraycopy(ArrayCopyNode *ac, AllocateArrayNode* alloc,
373 Node** ctrl, MergeMemNode* mem, Node** io,
374 const TypePtr* adr_type,
375 BasicType basic_elem_type,
376 Node* src, Node* src_offset,
377 Node* dest, Node* dest_offset,
378 Node* copy_length,
379 bool disjoint_bases,
380 bool length_never_negative,
381 RegionNode* slow_region) {
382 if (slow_region == nullptr) {
383 slow_region = new RegionNode(1);
384 transform_later(slow_region);
385 }
386
387 Node* original_dest = dest;
388 bool dest_needs_zeroing = false;
389 bool acopy_to_uninitialized = false;
390
391 // See if this is the initialization of a newly-allocated array.
392 // If so, we will take responsibility here for initializing it to zero.
393 // (Note: Because tightly_coupled_allocation performs checks on the
394 // out-edges of the dest, we need to avoid making derived pointers
395 // from it until we have checked its uses.)
396 if (ReduceBulkZeroing
397 && !(UseTLAB && ZeroTLAB) // pointless if already zeroed
398 && basic_elem_type != T_CONFLICT // avoid corner case
399 && !src->eqv_uncast(dest)
400 && alloc != nullptr
401 && _igvn.find_int_con(alloc->in(AllocateNode::ALength), 1) > 0) {
402 assert(ac->is_alloc_tightly_coupled(), "sanity");
403 // acopy to uninitialized tightly coupled allocations
404 // needs zeroing outside the copy range
405 // and the acopy itself will be to uninitialized memory
406 acopy_to_uninitialized = true;
407 if (alloc->maybe_set_complete(&_igvn)) {
408 // "You break it, you buy it."
409 InitializeNode* init = alloc->initialization();
410 assert(init->is_complete(), "we just did this");
411 init->set_complete_with_arraycopy();
412 assert(dest->is_CheckCastPP(), "sanity");
413 assert(dest->in(0)->in(0) == init, "dest pinned");
414 adr_type = TypeRawPtr::BOTTOM; // all initializations are into raw memory
415 // From this point on, every exit path is responsible for
416 // initializing any non-copied parts of the object to zero.
417 // Also, if this flag is set we make sure that arraycopy interacts properly
418 // with G1, eliding pre-barriers. See CR 6627983.
419 dest_needs_zeroing = true;
420 } else {
421 // dest_need_zeroing = false;
422 }
423 } else {
424 // No zeroing elimination needed here.
425 alloc = nullptr;
426 acopy_to_uninitialized = false;
427 //original_dest = dest;
428 //dest_needs_zeroing = false;
429 }
430
431 uint alias_idx = C->get_alias_index(adr_type);
432
433 // Results are placed here:
434 enum { fast_path = 1, // normal void-returning assembly stub
435 checked_path = 2, // special assembly stub with cleanup
436 slow_call_path = 3, // something went wrong; call the VM
437 zero_path = 4, // bypass when length of copy is zero
438 bcopy_path = 5, // copy primitive array by 64-bit blocks
439 PATH_LIMIT = 6
469 checked_i_o = *io;
470 checked_mem = mem->memory_at(alias_idx);
471 checked_value = cv;
472 *ctrl = top();
473 }
474
475 Node* not_pos = generate_nonpositive_guard(ctrl, copy_length, length_never_negative);
476 if (not_pos != nullptr) {
477 Node* local_ctrl = not_pos, *local_io = *io;
478 MergeMemNode* local_mem = MergeMemNode::make(mem);
479 transform_later(local_mem);
480
481 // (6) length must not be negative.
482 if (!length_never_negative) {
483 generate_negative_guard(&local_ctrl, copy_length, slow_region);
484 }
485
486 // copy_length is 0.
487 if (dest_needs_zeroing) {
488 assert(!local_ctrl->is_top(), "no ctrl?");
489 Node* dest_length = alloc->in(AllocateNode::ALength);
490 if (copy_length->eqv_uncast(dest_length)
491 || _igvn.find_int_con(dest_length, 1) <= 0) {
492 // There is no zeroing to do. No need for a secondary raw memory barrier.
493 } else {
494 // Clear the whole thing since there are no source elements to copy.
495 generate_clear_array(local_ctrl, local_mem,
496 adr_type, dest, basic_elem_type,
497 intcon(0), nullptr,
498 alloc->in(AllocateNode::AllocSize));
499 // Use a secondary InitializeNode as raw memory barrier.
500 // Currently it is needed only on this path since other
501 // paths have stub or runtime calls as raw memory barriers.
502 MemBarNode* mb = MemBarNode::make(C, Op_Initialize,
503 Compile::AliasIdxRaw,
504 top());
505 transform_later(mb);
506 mb->set_req(TypeFunc::Control,local_ctrl);
507 mb->set_req(TypeFunc::Memory, local_mem->memory_at(Compile::AliasIdxRaw));
508 local_ctrl = transform_later(new ProjNode(mb, TypeFunc::Control));
509 local_mem->set_memory_at(Compile::AliasIdxRaw, transform_later(new ProjNode(mb, TypeFunc::Memory)));
510
511 InitializeNode* init = mb->as_Initialize();
512 init->set_complete(&_igvn); // (there is no corresponding AllocateNode)
513 }
514 }
515
516 // Present the results of the fast call.
517 result_region->init_req(zero_path, local_ctrl);
518 result_i_o ->init_req(zero_path, local_io);
519 result_memory->init_req(zero_path, local_mem->memory_at(alias_idx));
520 }
521
522 if (!(*ctrl)->is_top() && dest_needs_zeroing) {
523 // We have to initialize the *uncopied* part of the array to zero.
524 // The copy destination is the slice dest[off..off+len]. The other slices
525 // are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length].
526 Node* dest_size = alloc->in(AllocateNode::AllocSize);
527 Node* dest_length = alloc->in(AllocateNode::ALength);
528 Node* dest_tail = transform_later( new AddINode(dest_offset, copy_length));
529
530 // If there is a head section that needs zeroing, do it now.
531 if (_igvn.find_int_con(dest_offset, -1) != 0) {
532 generate_clear_array(*ctrl, mem,
533 adr_type, dest, basic_elem_type,
534 intcon(0), dest_offset,
535 nullptr);
536 }
537
538 // Next, perform a dynamic check on the tail length.
539 // It is often zero, and we can win big if we prove this.
540 // There are two wins: Avoid generating the ClearArray
541 // with its attendant messy index arithmetic, and upgrade
542 // the copy to a more hardware-friendly word size of 64 bits.
543 Node* tail_ctl = nullptr;
544 if (!(*ctrl)->is_top() && !dest_tail->eqv_uncast(dest_length)) {
545 Node* cmp_lt = transform_later( new CmpINode(dest_tail, dest_length) );
546 Node* bol_lt = transform_later( new BoolNode(cmp_lt, BoolTest::lt) );
547 tail_ctl = generate_slow_guard(ctrl, bol_lt, nullptr);
548 assert(tail_ctl != nullptr || !(*ctrl)->is_top(), "must be an outcome");
549 }
550
551 // At this point, let's assume there is no tail.
552 if (!(*ctrl)->is_top() && alloc != nullptr && basic_elem_type != T_OBJECT) {
553 // There is no tail. Try an upgrade to a 64-bit copy.
562 src, src_offset, dest, dest_offset,
563 dest_size, acopy_to_uninitialized);
564 if (didit) {
565 // Present the results of the block-copying fast call.
566 result_region->init_req(bcopy_path, local_ctrl);
567 result_i_o ->init_req(bcopy_path, local_io);
568 result_memory->init_req(bcopy_path, local_mem->memory_at(alias_idx));
569 }
570 }
571 if (didit) {
572 *ctrl = top(); // no regular fast path
573 }
574 }
575
576 // Clear the tail, if any.
577 if (tail_ctl != nullptr) {
578 Node* notail_ctl = (*ctrl)->is_top() ? nullptr : *ctrl;
579 *ctrl = tail_ctl;
580 if (notail_ctl == nullptr) {
581 generate_clear_array(*ctrl, mem,
582 adr_type, dest, basic_elem_type,
583 dest_tail, nullptr,
584 dest_size);
585 } else {
586 // Make a local merge.
587 Node* done_ctl = transform_later(new RegionNode(3));
588 Node* done_mem = transform_later(new PhiNode(done_ctl, Type::MEMORY, adr_type));
589 done_ctl->init_req(1, notail_ctl);
590 done_mem->init_req(1, mem->memory_at(alias_idx));
591 generate_clear_array(*ctrl, mem,
592 adr_type, dest, basic_elem_type,
593 dest_tail, nullptr,
594 dest_size);
595 done_ctl->init_req(2, *ctrl);
596 done_mem->init_req(2, mem->memory_at(alias_idx));
597 *ctrl = done_ctl;
598 mem->set_memory_at(alias_idx, done_mem);
599 }
600 }
601 }
602
603 BasicType copy_type = basic_elem_type;
604 assert(basic_elem_type != T_ARRAY, "caller must fix this");
605 if (!(*ctrl)->is_top() && copy_type == T_OBJECT) {
606 // If src and dest have compatible element types, we can copy bits.
607 // Types S[] and D[] are compatible if D is a supertype of S.
608 //
609 // If they are not, we will use checked_oop_disjoint_arraycopy,
610 // which performs a fast optimistic per-oop check, and backs off
611 // further to JVM_ArrayCopy on the first per-oop check that fails.
612 // (Actually, we don't move raw bits only; the GC requires card marks.)
750 Node* length_minus = new SubINode(copy_length, slow_offset);
751 transform_later(length_minus);
752
753 // Tweak the node variables to adjust the code produced below:
754 src_offset = src_off_plus;
755 dest_offset = dest_off_plus;
756 copy_length = length_minus;
757 }
758 }
759 *ctrl = slow_control;
760 if (!(*ctrl)->is_top()) {
761 Node* local_ctrl = *ctrl, *local_io = slow_i_o;
762 MergeMemNode* local_mem = MergeMemNode::make(mem);
763 transform_later(local_mem);
764
765 // Generate the slow path, if needed.
766 local_mem->set_memory_at(alias_idx, slow_mem);
767
768 if (dest_needs_zeroing) {
769 generate_clear_array(local_ctrl, local_mem,
770 adr_type, dest, basic_elem_type,
771 intcon(0), nullptr,
772 alloc->in(AllocateNode::AllocSize));
773 }
774
775 local_mem = generate_slow_arraycopy(ac,
776 &local_ctrl, local_mem, &local_io,
777 adr_type,
778 src, src_offset, dest, dest_offset,
779 copy_length, /*dest_uninitialized*/false);
780
781 result_region->init_req(slow_call_path, local_ctrl);
782 result_i_o ->init_req(slow_call_path, local_io);
783 result_memory->init_req(slow_call_path, local_mem->memory_at(alias_idx));
784 } else {
785 ShouldNotReachHere(); // no call to generate_slow_arraycopy:
786 // projections were not extracted
787 }
788
789 // Remove unused edges.
790 for (uint i = 1; i < result_region->req(); i++) {
812 // The next memory barrier is added to avoid it. If the arraycopy can be
813 // optimized away (which it can, sometimes) then we can manually remove
814 // the membar also.
815 //
816 // Do not let reads from the cloned object float above the arraycopy.
817 if (alloc != nullptr && !alloc->initialization()->does_not_escape()) {
818 // Do not let stores that initialize this object be reordered with
819 // a subsequent store that would make this object accessible by
820 // other threads.
821 insert_mem_bar(ctrl, &out_mem, Op_MemBarStoreStore);
822 } else {
823 insert_mem_bar(ctrl, &out_mem, Op_MemBarCPUOrder);
824 }
825
826 if (is_partial_array_copy) {
827 assert((*ctrl)->is_Proj(), "MemBar control projection");
828 assert((*ctrl)->in(0)->isa_MemBar(), "MemBar node");
829 (*ctrl)->in(0)->isa_MemBar()->set_trailing_partial_array_copy();
830 }
831
832 _igvn.replace_node(_callprojs.fallthrough_memproj, out_mem);
833 if (_callprojs.fallthrough_ioproj != nullptr) {
834 _igvn.replace_node(_callprojs.fallthrough_ioproj, *io);
835 }
836 _igvn.replace_node(_callprojs.fallthrough_catchproj, *ctrl);
837
838 #ifdef ASSERT
839 const TypeOopPtr* dest_t = _igvn.type(dest)->is_oopptr();
840 if (dest_t->is_known_instance() && !is_partial_array_copy) {
841 ArrayCopyNode* ac = nullptr;
842 assert(ArrayCopyNode::may_modify(dest_t, (*ctrl)->in(0)->as_MemBar(), &_igvn, ac), "dependency on arraycopy lost");
843 assert(ac == nullptr, "no arraycopy anymore");
844 }
845 #endif
846
847 return out_mem;
848 }
849
850 // Helper for initialization of arrays, creating a ClearArray.
851 // It writes zero bits in [start..end), within the body of an array object.
852 // The memory effects are all chained onto the 'adr_type' alias category.
853 //
854 // Since the object is otherwise uninitialized, we are free
855 // to put a little "slop" around the edges of the cleared area,
856 // as long as it does not go back into the array's header,
857 // or beyond the array end within the heap.
858 //
859 // The lower edge can be rounded down to the nearest jint and the
860 // upper edge can be rounded up to the nearest MinObjAlignmentInBytes.
861 //
862 // Arguments:
863 // adr_type memory slice where writes are generated
864 // dest oop of the destination array
865 // basic_elem_type element type of the destination
866 // slice_idx array index of first element to store
867 // slice_len number of elements to store (or null)
868 // dest_size total size in bytes of the array object
869 //
870 // Exactly one of slice_len or dest_size must be non-null.
871 // If dest_size is non-null, zeroing extends to the end of the object.
872 // If slice_len is non-null, the slice_idx value must be a constant.
873 void PhaseMacroExpand::generate_clear_array(Node* ctrl, MergeMemNode* merge_mem,
874 const TypePtr* adr_type,
875 Node* dest,
876 BasicType basic_elem_type,
877 Node* slice_idx,
878 Node* slice_len,
879 Node* dest_size) {
880 // one or the other but not both of slice_len and dest_size:
881 assert((slice_len != nullptr? 1: 0) + (dest_size != nullptr? 1: 0) == 1, "");
882 if (slice_len == nullptr) slice_len = top();
883 if (dest_size == nullptr) dest_size = top();
884
885 uint alias_idx = C->get_alias_index(adr_type);
886
887 // operate on this memory slice:
888 Node* mem = merge_mem->memory_at(alias_idx); // memory slice to operate on
889
890 // scaling and rounding of indexes:
891 int scale = exact_log2(type2aelembytes(basic_elem_type));
892 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
893 int clear_low = (-1 << scale) & (BytesPerInt - 1);
894 int bump_bit = (-1 << scale) & BytesPerInt;
895
896 // determine constant starts and ends
897 const intptr_t BIG_NEG = -128;
898 assert(BIG_NEG + 2*abase < 0, "neg enough");
899 intptr_t slice_idx_con = (intptr_t) _igvn.find_int_con(slice_idx, BIG_NEG);
900 intptr_t slice_len_con = (intptr_t) _igvn.find_int_con(slice_len, BIG_NEG);
901 if (slice_len_con == 0) {
902 return; // nothing to do here
903 }
904 intptr_t start_con = (abase + (slice_idx_con << scale)) & ~clear_low;
905 intptr_t end_con = _igvn.find_intptr_t_con(dest_size, -1);
906 if (slice_idx_con >= 0 && slice_len_con >= 0) {
907 assert(end_con < 0, "not two cons");
908 end_con = align_up(abase + ((slice_idx_con + slice_len_con) << scale),
909 BytesPerLong);
910 }
911
912 if (start_con >= 0 && end_con >= 0) {
913 // Constant start and end. Simple.
914 mem = ClearArrayNode::clear_memory(ctrl, mem, dest,
915 start_con, end_con, &_igvn);
916 } else if (start_con >= 0 && dest_size != top()) {
917 // Constant start, pre-rounded end after the tail of the array.
918 Node* end = dest_size;
919 mem = ClearArrayNode::clear_memory(ctrl, mem, dest,
920 start_con, end, &_igvn);
921 } else if (start_con >= 0 && slice_len != top()) {
922 // Constant start, non-constant end. End needs rounding up.
923 // End offset = round_up(abase + ((slice_idx_con + slice_len) << scale), 8)
924 intptr_t end_base = abase + (slice_idx_con << scale);
925 int end_round = (-1 << scale) & (BytesPerLong - 1);
926 Node* end = ConvI2X(slice_len);
927 if (scale != 0)
928 end = transform_later(new LShiftXNode(end, intcon(scale) ));
929 end_base += end_round;
930 end = transform_later(new AddXNode(end, MakeConX(end_base)) );
931 end = transform_later(new AndXNode(end, MakeConX(~end_round)) );
932 mem = ClearArrayNode::clear_memory(ctrl, mem, dest,
933 start_con, end, &_igvn);
934 } else if (start_con < 0 && dest_size != top()) {
935 // Non-constant start, pre-rounded end after the tail of the array.
936 // This is almost certainly a "round-to-end" operation.
937 Node* start = slice_idx;
938 start = ConvI2X(start);
939 if (scale != 0)
940 start = transform_later(new LShiftXNode( start, intcon(scale) ));
941 start = transform_later(new AddXNode(start, MakeConX(abase)) );
942 if ((bump_bit | clear_low) != 0) {
943 int to_clear = (bump_bit | clear_low);
944 // Align up mod 8, then store a jint zero unconditionally
945 // just before the mod-8 boundary.
946 if (((abase + bump_bit) & ~to_clear) - bump_bit
947 < arrayOopDesc::length_offset_in_bytes() + BytesPerInt) {
948 bump_bit = 0;
949 assert((abase & to_clear) == 0, "array base must be long-aligned");
950 } else {
951 // Bump 'start' up to (or past) the next jint boundary:
952 start = transform_later( new AddXNode(start, MakeConX(bump_bit)) );
953 assert((abase & clear_low) == 0, "array base must be int-aligned");
954 }
955 // Round bumped 'start' down to jlong boundary in body of array.
956 start = transform_later(new AndXNode(start, MakeConX(~to_clear)) );
957 if (bump_bit != 0) {
958 // Store a zero to the immediately preceding jint:
959 Node* x1 = transform_later(new AddXNode(start, MakeConX(-bump_bit)) );
960 Node* p1 = basic_plus_adr(dest, x1);
961 mem = StoreNode::make(_igvn, ctrl, mem, p1, adr_type, intcon(0), T_INT, MemNode::unordered);
962 mem = transform_later(mem);
963 }
964 }
965 Node* end = dest_size; // pre-rounded
966 mem = ClearArrayNode::clear_memory(ctrl, mem, dest,
967 start, end, &_igvn);
968 } else {
969 // Non-constant start, unrounded non-constant end.
970 // (Nobody zeroes a random midsection of an array using this routine.)
971 ShouldNotReachHere(); // fix caller
972 }
973
974 // Done.
975 merge_mem->set_memory_at(alias_idx, mem);
976 }
977
978 bool PhaseMacroExpand::generate_block_arraycopy(Node** ctrl, MergeMemNode** mem, Node* io,
979 const TypePtr* adr_type,
980 BasicType basic_elem_type,
981 AllocateNode* alloc,
982 Node* src, Node* src_offset,
983 Node* dest, Node* dest_offset,
984 Node* dest_size, bool dest_uninitialized) {
985 // See if there is an advantage from block transfer.
986 int scale = exact_log2(type2aelembytes(basic_elem_type));
1062 const TypeFunc* call_type = OptoRuntime::slow_arraycopy_Type();
1063 CallNode* call = new CallStaticJavaNode(call_type, OptoRuntime::slow_arraycopy_Java(),
1064 "slow_arraycopy", TypePtr::BOTTOM);
1065
1066 call->init_req(TypeFunc::Control, *ctrl);
1067 call->init_req(TypeFunc::I_O , *io);
1068 call->init_req(TypeFunc::Memory , mem);
1069 call->init_req(TypeFunc::ReturnAdr, top());
1070 call->init_req(TypeFunc::FramePtr, top());
1071 call->init_req(TypeFunc::Parms+0, src);
1072 call->init_req(TypeFunc::Parms+1, src_offset);
1073 call->init_req(TypeFunc::Parms+2, dest);
1074 call->init_req(TypeFunc::Parms+3, dest_offset);
1075 call->init_req(TypeFunc::Parms+4, copy_length);
1076 call->copy_call_debug_info(&_igvn, ac);
1077
1078 call->set_cnt(PROB_UNLIKELY_MAG(4)); // Same effect as RC_UNCOMMON.
1079 _igvn.replace_node(ac, call);
1080 transform_later(call);
1081
1082 call->extract_projections(&_callprojs, false /*separate_io_proj*/, false /*do_asserts*/);
1083 *ctrl = _callprojs.fallthrough_catchproj->clone();
1084 transform_later(*ctrl);
1085
1086 Node* m = _callprojs.fallthrough_memproj->clone();
1087 transform_later(m);
1088
1089 uint alias_idx = C->get_alias_index(adr_type);
1090 MergeMemNode* out_mem;
1091 if (alias_idx != Compile::AliasIdxBot) {
1092 out_mem = MergeMemNode::make(mem);
1093 out_mem->set_memory_at(alias_idx, m);
1094 } else {
1095 out_mem = MergeMemNode::make(m);
1096 }
1097 transform_later(out_mem);
1098
1099 // When src is negative and arraycopy is before an infinite loop,_callprojs.fallthrough_ioproj
1100 // could be null. Skip clone and update null fallthrough_ioproj.
1101 if (_callprojs.fallthrough_ioproj != nullptr) {
1102 *io = _callprojs.fallthrough_ioproj->clone();
1103 transform_later(*io);
1104 } else {
1105 *io = nullptr;
1106 }
1107
1108 return out_mem;
1109 }
1110
1111 // Helper function; generates code for cases requiring runtime checks.
1112 Node* PhaseMacroExpand::generate_checkcast_arraycopy(Node** ctrl, MergeMemNode** mem,
1113 const TypePtr* adr_type,
1114 Node* dest_elem_klass,
1115 Node* src, Node* src_offset,
1116 Node* dest, Node* dest_offset,
1117 Node* copy_length, bool dest_uninitialized) {
1118 if ((*ctrl)->is_top()) return nullptr;
1119
1120 address copyfunc_addr = StubRoutines::checkcast_arraycopy(dest_uninitialized);
1121 if (copyfunc_addr == nullptr) { // Stub was not generated, go slow path.
1122 return nullptr;
1214 if (exit_block) {
1215 exit_block->init_req(2, *ctrl);
1216
1217 // Memory edge corresponding to stub_region.
1218 result_memory->init_req(2, *mem);
1219
1220 uint alias_idx = C->get_alias_index(adr_type);
1221 if (alias_idx != Compile::AliasIdxBot) {
1222 *mem = MergeMemNode::make(*mem);
1223 (*mem)->set_memory_at(alias_idx, result_memory);
1224 } else {
1225 *mem = MergeMemNode::make(result_memory);
1226 }
1227 transform_later(*mem);
1228 *ctrl = exit_block;
1229 return true;
1230 }
1231 return false;
1232 }
1233
1234 #undef XTOP
1235
1236 void PhaseMacroExpand::expand_arraycopy_node(ArrayCopyNode *ac) {
1237 Node* ctrl = ac->in(TypeFunc::Control);
1238 Node* io = ac->in(TypeFunc::I_O);
1239 Node* src = ac->in(ArrayCopyNode::Src);
1240 Node* src_offset = ac->in(ArrayCopyNode::SrcPos);
1241 Node* dest = ac->in(ArrayCopyNode::Dest);
1242 Node* dest_offset = ac->in(ArrayCopyNode::DestPos);
1243 Node* length = ac->in(ArrayCopyNode::Length);
1244 MergeMemNode* merge_mem = nullptr;
1245
1246 if (ac->is_clonebasic()) {
1247 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
1248 bs->clone_at_expansion(this, ac);
1249 return;
1250 } else if (ac->is_copyof() || ac->is_copyofrange() || ac->is_clone_oop_array()) {
1251 Node* mem = ac->in(TypeFunc::Memory);
1252 merge_mem = MergeMemNode::make(mem);
1253 transform_later(merge_mem);
1254
1255 AllocateArrayNode* alloc = nullptr;
1256 if (ac->is_alloc_tightly_coupled()) {
1257 alloc = AllocateArrayNode::Ideal_array_allocation(dest);
1258 assert(alloc != nullptr, "expect alloc");
1259 }
1260
1261 const TypePtr* adr_type = _igvn.type(dest)->is_oopptr()->add_offset(Type::OffsetBot);
1262 if (ac->_dest_type != TypeOopPtr::BOTTOM) {
1263 adr_type = ac->_dest_type->add_offset(Type::OffsetBot)->is_ptr();
1264 }
1265 generate_arraycopy(ac, alloc, &ctrl, merge_mem, &io,
1266 adr_type, T_OBJECT,
1267 src, src_offset, dest, dest_offset, length,
1268 true, ac->has_negative_length_guard());
1269
1270 return;
1271 }
1272
1273 AllocateArrayNode* alloc = nullptr;
1274 if (ac->is_alloc_tightly_coupled()) {
1275 alloc = AllocateArrayNode::Ideal_array_allocation(dest);
1276 assert(alloc != nullptr, "expect alloc");
1277 }
1278
1279 assert(ac->is_arraycopy() || ac->is_arraycopy_validated(), "should be an arraycopy");
1280
1281 // Compile time checks. If any of these checks cannot be verified at compile time,
1282 // we do not make a fast path for this call. Instead, we let the call remain as it
1283 // is. The checks we choose to mandate at compile time are:
1284 //
1285 // (1) src and dest are arrays.
1286 const Type* src_type = src->Value(&_igvn);
1287 const Type* dest_type = dest->Value(&_igvn);
1288 const TypeAryPtr* top_src = src_type->isa_aryptr();
1289 const TypeAryPtr* top_dest = dest_type->isa_aryptr();
1290
1291 BasicType src_elem = T_CONFLICT;
1292 BasicType dest_elem = T_CONFLICT;
1293
1294 if (top_src != nullptr && top_src->elem() != Type::BOTTOM) {
1295 src_elem = top_src->elem()->array_element_basic_type();
1296 }
1297 if (top_dest != nullptr && top_dest->elem() != Type::BOTTOM) {
1298 dest_elem = top_dest->elem()->array_element_basic_type();
1299 }
1300 if (is_reference_type(src_elem, true)) src_elem = T_OBJECT;
1301 if (is_reference_type(dest_elem, true)) dest_elem = T_OBJECT;
1302
1303 if (ac->is_arraycopy_validated() &&
1304 dest_elem != T_CONFLICT &&
1305 src_elem == T_CONFLICT) {
1306 src_elem = dest_elem;
1307 }
1308
1309 if (src_elem == T_CONFLICT || dest_elem == T_CONFLICT) {
1310 // Conservatively insert a memory barrier on all memory slices.
1311 // Do not let writes into the source float below the arraycopy.
1312 {
1313 Node* mem = ac->in(TypeFunc::Memory);
1314 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder);
1315
1316 merge_mem = MergeMemNode::make(mem);
1317 transform_later(merge_mem);
1318 }
1319
1320 // Call StubRoutines::generic_arraycopy stub.
1321 Node* mem = generate_arraycopy(ac, nullptr, &ctrl, merge_mem, &io,
1322 TypeRawPtr::BOTTOM, T_CONFLICT,
1323 src, src_offset, dest, dest_offset, length,
1324 // If a negative length guard was generated for the ArrayCopyNode,
1325 // the length of the array can never be negative.
1326 false, ac->has_negative_length_guard());
1327 return;
1328 }
1329
1330 assert(!ac->is_arraycopy_validated() || (src_elem == dest_elem && dest_elem != T_VOID), "validated but different basic types");
1331
1332 // (2) src and dest arrays must have elements of the same BasicType
1333 // Figure out the size and type of the elements we will be copying.
1334 if (src_elem != dest_elem || dest_elem == T_VOID) {
1335 // The component types are not the same or are not recognized. Punt.
1336 // (But, avoid the native method wrapper to JVM_ArrayCopy.)
1337 {
1338 Node* mem = ac->in(TypeFunc::Memory);
1339 merge_mem = generate_slow_arraycopy(ac, &ctrl, mem, &io, TypePtr::BOTTOM, src, src_offset, dest, dest_offset, length, false);
1340 }
1341
1342 _igvn.replace_node(_callprojs.fallthrough_memproj, merge_mem);
1343 if (_callprojs.fallthrough_ioproj != nullptr) {
1344 _igvn.replace_node(_callprojs.fallthrough_ioproj, io);
1345 }
1346 _igvn.replace_node(_callprojs.fallthrough_catchproj, ctrl);
1347 return;
1348 }
1349
1350 //---------------------------------------------------------------------------
1351 // We will make a fast path for this call to arraycopy.
1352
1353 // We have the following tests left to perform:
1354 //
1355 // (3) src and dest must not be null.
1356 // (4) src_offset must not be negative.
1357 // (5) dest_offset must not be negative.
1358 // (6) length must not be negative.
1359 // (7) src_offset + length must not exceed length of src.
1360 // (8) dest_offset + length must not exceed length of dest.
1361 // (9) each element of an oop array must be assignable
1362
1363 {
1364 Node* mem = ac->in(TypeFunc::Memory);
1365 merge_mem = MergeMemNode::make(mem);
1366 transform_later(merge_mem);
1367 }
1368
1369 RegionNode* slow_region = new RegionNode(1);
1370 transform_later(slow_region);
1371
1372 if (!ac->is_arraycopy_validated()) {
1373 // (3) operands must not be null
1374 // We currently perform our null checks with the null_check routine.
1375 // This means that the null exceptions will be reported in the caller
1376 // rather than (correctly) reported inside of the native arraycopy call.
1377 // This should be corrected, given time. We do our null check with the
1378 // stack pointer restored.
1379 // null checks done library_call.cpp
1380
1381 // (4) src_offset must not be negative.
1382 generate_negative_guard(&ctrl, src_offset, slow_region);
1383
1384 // (5) dest_offset must not be negative.
1385 generate_negative_guard(&ctrl, dest_offset, slow_region);
1386
1387 // (6) length must not be negative (moved to generate_arraycopy()).
1388 // generate_negative_guard(length, slow_region);
1389
1390 // (7) src_offset + length must not exceed length of src.
1391 Node* alen = ac->in(ArrayCopyNode::SrcLen);
1392 assert(alen != nullptr, "need src len");
1393 generate_limit_guard(&ctrl,
1394 src_offset, length,
1395 alen,
1396 slow_region);
1397
1398 // (8) dest_offset + length must not exceed length of dest.
1399 alen = ac->in(ArrayCopyNode::DestLen);
1400 assert(alen != nullptr, "need dest len");
1401 generate_limit_guard(&ctrl,
1402 dest_offset, length,
1403 alen,
1404 slow_region);
1405
1406 // (9) each element of an oop array must be assignable
1407 // The generate_arraycopy subroutine checks this.
1408 }
1409 // This is where the memory effects are placed:
1410 const TypePtr* adr_type = nullptr;
1411 if (ac->_dest_type != TypeOopPtr::BOTTOM) {
1412 adr_type = ac->_dest_type->add_offset(Type::OffsetBot)->is_ptr();
1413 } else {
1414 adr_type = TypeAryPtr::get_array_body_type(dest_elem);
1415 }
1416
1417 generate_arraycopy(ac, alloc, &ctrl, merge_mem, &io,
1418 adr_type, dest_elem,
1419 src, src_offset, dest, dest_offset, length,
1420 // If a negative length guard was generated for the ArrayCopyNode,
1421 // the length of the array can never be negative.
1422 false, ac->has_negative_length_guard(), slow_region);
1423 }
|
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "ci/ciFlatArrayKlass.hpp"
26 #include "gc/shared/barrierSet.hpp"
27 #include "gc/shared/tlab_globals.hpp"
28 #include "opto/arraycopynode.hpp"
29 #include "oops/objArrayKlass.hpp"
30 #include "opto/convertnode.hpp"
31 #include "opto/vectornode.hpp"
32 #include "opto/graphKit.hpp"
33 #include "opto/macro.hpp"
34 #include "opto/runtime.hpp"
35 #include "opto/castnode.hpp"
36 #include "runtime/stubRoutines.hpp"
37 #include "utilities/align.hpp"
38 #include "utilities/powerOfTwo.hpp"
39
40 void PhaseMacroExpand::insert_mem_bar(Node** ctrl, Node** mem, int opcode, Node* precedent) {
41 MemBarNode* mb = MemBarNode::make(C, opcode, Compile::AliasIdxBot, precedent);
42 mb->init_req(TypeFunc::Control, *ctrl);
43 mb->init_req(TypeFunc::Memory, *mem);
44 transform_later(mb);
45 *ctrl = new ProjNode(mb,TypeFunc::Control);
122 }
123
124 IfNode* iff = new IfNode(*ctrl, test, true_prob, COUNT_UNKNOWN);
125 transform_later(iff);
126
127 Node* if_slow = new IfTrueNode(iff);
128 transform_later(if_slow);
129
130 if (region != nullptr) {
131 region->add_req(if_slow);
132 }
133
134 Node* if_fast = new IfFalseNode(iff);
135 transform_later(if_fast);
136
137 *ctrl = if_fast;
138
139 return if_slow;
140 }
141
142 Node* PhaseMacroExpand::generate_slow_guard(Node** ctrl, Node* test, RegionNode* region) {
143 return generate_guard(ctrl, test, region, PROB_UNLIKELY_MAG(3));
144 }
145
146 inline Node* PhaseMacroExpand::generate_fair_guard(Node** ctrl, Node* test, RegionNode* region) {
147 return generate_guard(ctrl, test, region, PROB_FAIR);
148 }
149
150 void PhaseMacroExpand::generate_negative_guard(Node** ctrl, Node* index, RegionNode* region) {
151 if ((*ctrl)->is_top())
152 return; // already stopped
153 if (_igvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
154 return; // index is already adequately typed
155 Node* cmp_lt = new CmpINode(index, intcon(0));
156 transform_later(cmp_lt);
157 Node* bol_lt = new BoolNode(cmp_lt, BoolTest::lt);
158 transform_later(bol_lt);
159 generate_guard(ctrl, bol_lt, region, PROB_MIN);
160 }
161
162 void PhaseMacroExpand::generate_limit_guard(Node** ctrl, Node* offset, Node* subseq_length, Node* array_length, RegionNode* region) {
163 if ((*ctrl)->is_top())
164 return; // already stopped
165 bool zero_offset = _igvn.type(offset) == TypeInt::ZERO;
166 if (zero_offset && subseq_length->eqv_uncast(array_length))
167 return; // common case of whole-array copy
168 Node* last = subseq_length;
169 if (!zero_offset) { // last += offset
270
271 *ctrl = stub_block;
272 }
273
274
275 Node* PhaseMacroExpand::generate_nonpositive_guard(Node** ctrl, Node* index, bool never_negative) {
276 if ((*ctrl)->is_top()) return nullptr;
277
278 if (_igvn.type(index)->higher_equal(TypeInt::POS1)) // [1,maxint]
279 return nullptr; // index is already adequately typed
280 Node* cmp_le = new CmpINode(index, intcon(0));
281 transform_later(cmp_le);
282 BoolTest::mask le_or_eq = (never_negative ? BoolTest::eq : BoolTest::le);
283 Node* bol_le = new BoolNode(cmp_le, le_or_eq);
284 transform_later(bol_le);
285 Node* is_notp = generate_guard(ctrl, bol_le, nullptr, PROB_MIN);
286
287 return is_notp;
288 }
289
290 Node* PhaseMacroExpand::mark_word_test(Node** ctrl, Node* obj, MergeMemNode* mem, uintptr_t mask_val, RegionNode* region) {
291 // Load markword and check if obj is locked
292 Node* mark = make_load(nullptr, mem->memory_at(Compile::AliasIdxRaw), obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type());
293 Node* locked_bit = MakeConX(markWord::unlocked_value);
294 locked_bit = transform_later(new AndXNode(locked_bit, mark));
295 Node* cmp = transform_later(new CmpXNode(locked_bit, MakeConX(0)));
296 Node* is_unlocked = transform_later(new BoolNode(cmp, BoolTest::ne));
297 IfNode* iff = transform_later(new IfNode(*ctrl, is_unlocked, PROB_MAX, COUNT_UNKNOWN))->as_If();
298 Node* locked_region = transform_later(new RegionNode(3));
299 Node* mark_phi = transform_later(new PhiNode(locked_region, TypeX_X));
300
301 // Unlocked: Use bits from mark word
302 locked_region->init_req(1, transform_later(new IfTrueNode(iff)));
303 mark_phi->init_req(1, mark);
304
305 // Locked: Load prototype header from klass
306 *ctrl = transform_later(new IfFalseNode(iff));
307 // Make loads control dependent to make sure they are only executed if array is locked
308 Node* klass_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
309 Node* klass = transform_later(LoadKlassNode::make(_igvn, C->immutable_memory(), klass_adr, TypeInstPtr::KLASS, TypeInstKlassPtr::OBJECT));
310 Node* proto_adr = basic_plus_adr(klass, in_bytes(Klass::prototype_header_offset()));
311 Node* proto = transform_later(LoadNode::make(_igvn, *ctrl, C->immutable_memory(), proto_adr, proto_adr->bottom_type()->is_ptr(), TypeX_X, TypeX_X->basic_type(), MemNode::unordered));
312
313 locked_region->init_req(2, *ctrl);
314 mark_phi->init_req(2, proto);
315 *ctrl = locked_region;
316
317 // Now check if mark word bits are set
318 Node* mask = MakeConX(mask_val);
319 Node* masked = transform_later(new AndXNode(mark_phi, mask));
320 cmp = transform_later(new CmpXNode(masked, mask));
321 Node* bol = transform_later(new BoolNode(cmp, BoolTest::eq));
322 return generate_fair_guard(ctrl, bol, region);
323 }
324
325 Node* PhaseMacroExpand::generate_flat_array_guard(Node** ctrl, Node* array, MergeMemNode* mem, RegionNode* region) {
326 return mark_word_test(ctrl, array, mem, markWord::flat_array_bit_in_place, region);
327 }
328
329 Node* PhaseMacroExpand::generate_null_free_array_guard(Node** ctrl, Node* array, MergeMemNode* mem, RegionNode* region) {
330 return mark_word_test(ctrl, array, mem, markWord::null_free_array_bit_in_place, region);
331 }
332
333 void PhaseMacroExpand::finish_arraycopy_call(Node* call, Node** ctrl, MergeMemNode** mem, const TypePtr* adr_type) {
334 transform_later(call);
335
336 *ctrl = new ProjNode(call,TypeFunc::Control);
337 transform_later(*ctrl);
338 Node* newmem = new ProjNode(call, TypeFunc::Memory);
339 transform_later(newmem);
340
341 uint alias_idx = C->get_alias_index(adr_type);
342 if (alias_idx != Compile::AliasIdxBot) {
343 *mem = MergeMemNode::make(*mem);
344 (*mem)->set_memory_at(alias_idx, newmem);
345 } else {
346 *mem = MergeMemNode::make(newmem);
347 }
348 transform_later(*mem);
349 }
350
351 address PhaseMacroExpand::basictype2arraycopy(BasicType t,
352 Node* src_offset,
407 // }
408 // }
409 // // adjust params for remaining work:
410 // if (slowval != -1) {
411 // n = -1^slowval; src_offset += n; dest_offset += n; length -= n
412 // }
413 // slow_region:
414 // call slow arraycopy(src, src_offset, dest, dest_offset, length)
415 // return // via slow_call_path
416 //
417 // This routine is used from several intrinsics: System.arraycopy,
418 // Object.clone (the array subcase), and Arrays.copyOf[Range].
419 //
420 Node* PhaseMacroExpand::generate_arraycopy(ArrayCopyNode *ac, AllocateArrayNode* alloc,
421 Node** ctrl, MergeMemNode* mem, Node** io,
422 const TypePtr* adr_type,
423 BasicType basic_elem_type,
424 Node* src, Node* src_offset,
425 Node* dest, Node* dest_offset,
426 Node* copy_length,
427 Node* dest_length,
428 bool disjoint_bases,
429 bool length_never_negative,
430 RegionNode* slow_region) {
431 if (slow_region == nullptr) {
432 slow_region = new RegionNode(1);
433 transform_later(slow_region);
434 }
435
436 Node* original_dest = dest;
437 bool dest_needs_zeroing = false;
438 bool acopy_to_uninitialized = false;
439 Node* default_value = nullptr;
440 Node* raw_default_value = nullptr;
441
442 // See if this is the initialization of a newly-allocated array.
443 // If so, we will take responsibility here for initializing it to zero.
444 // (Note: Because tightly_coupled_allocation performs checks on the
445 // out-edges of the dest, we need to avoid making derived pointers
446 // from it until we have checked its uses.)
447 if (ReduceBulkZeroing
448 && !(UseTLAB && ZeroTLAB) // pointless if already zeroed
449 && basic_elem_type != T_CONFLICT // avoid corner case
450 && !src->eqv_uncast(dest)
451 && alloc != nullptr
452 && _igvn.find_int_con(alloc->in(AllocateNode::ALength), 1) > 0) {
453 assert(ac->is_alloc_tightly_coupled(), "sanity");
454 // acopy to uninitialized tightly coupled allocations
455 // needs zeroing outside the copy range
456 // and the acopy itself will be to uninitialized memory
457 acopy_to_uninitialized = true;
458 if (alloc->maybe_set_complete(&_igvn)) {
459 // "You break it, you buy it."
460 InitializeNode* init = alloc->initialization();
461 assert(init->is_complete(), "we just did this");
462 init->set_complete_with_arraycopy();
463 assert(dest->is_CheckCastPP(), "sanity");
464 assert(dest->in(0)->in(0) == init, "dest pinned");
465 adr_type = TypeRawPtr::BOTTOM; // all initializations are into raw memory
466 // From this point on, every exit path is responsible for
467 // initializing any non-copied parts of the object to zero.
468 // Also, if this flag is set we make sure that arraycopy interacts properly
469 // with G1, eliding pre-barriers. See CR 6627983.
470 dest_needs_zeroing = true;
471 default_value = alloc->in(AllocateNode::DefaultValue);
472 raw_default_value = alloc->in(AllocateNode::RawDefaultValue);
473 } else {
474 // dest_need_zeroing = false;
475 }
476 } else {
477 // No zeroing elimination needed here.
478 alloc = nullptr;
479 acopy_to_uninitialized = false;
480 //original_dest = dest;
481 //dest_needs_zeroing = false;
482 }
483
484 uint alias_idx = C->get_alias_index(adr_type);
485
486 // Results are placed here:
487 enum { fast_path = 1, // normal void-returning assembly stub
488 checked_path = 2, // special assembly stub with cleanup
489 slow_call_path = 3, // something went wrong; call the VM
490 zero_path = 4, // bypass when length of copy is zero
491 bcopy_path = 5, // copy primitive array by 64-bit blocks
492 PATH_LIMIT = 6
522 checked_i_o = *io;
523 checked_mem = mem->memory_at(alias_idx);
524 checked_value = cv;
525 *ctrl = top();
526 }
527
528 Node* not_pos = generate_nonpositive_guard(ctrl, copy_length, length_never_negative);
529 if (not_pos != nullptr) {
530 Node* local_ctrl = not_pos, *local_io = *io;
531 MergeMemNode* local_mem = MergeMemNode::make(mem);
532 transform_later(local_mem);
533
534 // (6) length must not be negative.
535 if (!length_never_negative) {
536 generate_negative_guard(&local_ctrl, copy_length, slow_region);
537 }
538
539 // copy_length is 0.
540 if (dest_needs_zeroing) {
541 assert(!local_ctrl->is_top(), "no ctrl?");
542 if (copy_length->eqv_uncast(dest_length)
543 || _igvn.find_int_con(dest_length, 1) <= 0) {
544 // There is no zeroing to do. No need for a secondary raw memory barrier.
545 } else {
546 // Clear the whole thing since there are no source elements to copy.
547 generate_clear_array(local_ctrl, local_mem,
548 adr_type, dest,
549 default_value, raw_default_value,
550 basic_elem_type,
551 intcon(0), nullptr,
552 alloc->in(AllocateNode::AllocSize));
553 // Use a secondary InitializeNode as raw memory barrier.
554 // Currently it is needed only on this path since other
555 // paths have stub or runtime calls as raw memory barriers.
556 MemBarNode* mb = MemBarNode::make(C, Op_Initialize,
557 Compile::AliasIdxRaw,
558 top());
559 transform_later(mb);
560 mb->set_req(TypeFunc::Control,local_ctrl);
561 mb->set_req(TypeFunc::Memory, local_mem->memory_at(Compile::AliasIdxRaw));
562 local_ctrl = transform_later(new ProjNode(mb, TypeFunc::Control));
563 local_mem->set_memory_at(Compile::AliasIdxRaw, transform_later(new ProjNode(mb, TypeFunc::Memory)));
564
565 InitializeNode* init = mb->as_Initialize();
566 init->set_complete(&_igvn); // (there is no corresponding AllocateNode)
567 }
568 }
569
570 // Present the results of the fast call.
571 result_region->init_req(zero_path, local_ctrl);
572 result_i_o ->init_req(zero_path, local_io);
573 result_memory->init_req(zero_path, local_mem->memory_at(alias_idx));
574 }
575
576 if (!(*ctrl)->is_top() && dest_needs_zeroing) {
577 // We have to initialize the *uncopied* part of the array to zero.
578 // The copy destination is the slice dest[off..off+len]. The other slices
579 // are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length].
580 Node* dest_size = alloc->in(AllocateNode::AllocSize);
581 Node* dest_tail = transform_later( new AddINode(dest_offset, copy_length));
582
583 // If there is a head section that needs zeroing, do it now.
584 if (_igvn.find_int_con(dest_offset, -1) != 0) {
585 generate_clear_array(*ctrl, mem,
586 adr_type, dest,
587 default_value, raw_default_value,
588 basic_elem_type,
589 intcon(0), dest_offset,
590 nullptr);
591 }
592
593 // Next, perform a dynamic check on the tail length.
594 // It is often zero, and we can win big if we prove this.
595 // There are two wins: Avoid generating the ClearArray
596 // with its attendant messy index arithmetic, and upgrade
597 // the copy to a more hardware-friendly word size of 64 bits.
598 Node* tail_ctl = nullptr;
599 if (!(*ctrl)->is_top() && !dest_tail->eqv_uncast(dest_length)) {
600 Node* cmp_lt = transform_later( new CmpINode(dest_tail, dest_length) );
601 Node* bol_lt = transform_later( new BoolNode(cmp_lt, BoolTest::lt) );
602 tail_ctl = generate_slow_guard(ctrl, bol_lt, nullptr);
603 assert(tail_ctl != nullptr || !(*ctrl)->is_top(), "must be an outcome");
604 }
605
606 // At this point, let's assume there is no tail.
607 if (!(*ctrl)->is_top() && alloc != nullptr && basic_elem_type != T_OBJECT) {
608 // There is no tail. Try an upgrade to a 64-bit copy.
617 src, src_offset, dest, dest_offset,
618 dest_size, acopy_to_uninitialized);
619 if (didit) {
620 // Present the results of the block-copying fast call.
621 result_region->init_req(bcopy_path, local_ctrl);
622 result_i_o ->init_req(bcopy_path, local_io);
623 result_memory->init_req(bcopy_path, local_mem->memory_at(alias_idx));
624 }
625 }
626 if (didit) {
627 *ctrl = top(); // no regular fast path
628 }
629 }
630
631 // Clear the tail, if any.
632 if (tail_ctl != nullptr) {
633 Node* notail_ctl = (*ctrl)->is_top() ? nullptr : *ctrl;
634 *ctrl = tail_ctl;
635 if (notail_ctl == nullptr) {
636 generate_clear_array(*ctrl, mem,
637 adr_type, dest,
638 default_value, raw_default_value,
639 basic_elem_type,
640 dest_tail, nullptr,
641 dest_size);
642 } else {
643 // Make a local merge.
644 Node* done_ctl = transform_later(new RegionNode(3));
645 Node* done_mem = transform_later(new PhiNode(done_ctl, Type::MEMORY, adr_type));
646 done_ctl->init_req(1, notail_ctl);
647 done_mem->init_req(1, mem->memory_at(alias_idx));
648 generate_clear_array(*ctrl, mem,
649 adr_type, dest,
650 default_value, raw_default_value,
651 basic_elem_type,
652 dest_tail, nullptr,
653 dest_size);
654 done_ctl->init_req(2, *ctrl);
655 done_mem->init_req(2, mem->memory_at(alias_idx));
656 *ctrl = done_ctl;
657 mem->set_memory_at(alias_idx, done_mem);
658 }
659 }
660 }
661
662 BasicType copy_type = basic_elem_type;
663 assert(basic_elem_type != T_ARRAY, "caller must fix this");
664 if (!(*ctrl)->is_top() && copy_type == T_OBJECT) {
665 // If src and dest have compatible element types, we can copy bits.
666 // Types S[] and D[] are compatible if D is a supertype of S.
667 //
668 // If they are not, we will use checked_oop_disjoint_arraycopy,
669 // which performs a fast optimistic per-oop check, and backs off
670 // further to JVM_ArrayCopy on the first per-oop check that fails.
671 // (Actually, we don't move raw bits only; the GC requires card marks.)
809 Node* length_minus = new SubINode(copy_length, slow_offset);
810 transform_later(length_minus);
811
812 // Tweak the node variables to adjust the code produced below:
813 src_offset = src_off_plus;
814 dest_offset = dest_off_plus;
815 copy_length = length_minus;
816 }
817 }
818 *ctrl = slow_control;
819 if (!(*ctrl)->is_top()) {
820 Node* local_ctrl = *ctrl, *local_io = slow_i_o;
821 MergeMemNode* local_mem = MergeMemNode::make(mem);
822 transform_later(local_mem);
823
824 // Generate the slow path, if needed.
825 local_mem->set_memory_at(alias_idx, slow_mem);
826
827 if (dest_needs_zeroing) {
828 generate_clear_array(local_ctrl, local_mem,
829 adr_type, dest,
830 default_value, raw_default_value,
831 basic_elem_type,
832 intcon(0), nullptr,
833 alloc->in(AllocateNode::AllocSize));
834 }
835
836 local_mem = generate_slow_arraycopy(ac,
837 &local_ctrl, local_mem, &local_io,
838 adr_type,
839 src, src_offset, dest, dest_offset,
840 copy_length, /*dest_uninitialized*/false);
841
842 result_region->init_req(slow_call_path, local_ctrl);
843 result_i_o ->init_req(slow_call_path, local_io);
844 result_memory->init_req(slow_call_path, local_mem->memory_at(alias_idx));
845 } else {
846 ShouldNotReachHere(); // no call to generate_slow_arraycopy:
847 // projections were not extracted
848 }
849
850 // Remove unused edges.
851 for (uint i = 1; i < result_region->req(); i++) {
873 // The next memory barrier is added to avoid it. If the arraycopy can be
874 // optimized away (which it can, sometimes) then we can manually remove
875 // the membar also.
876 //
877 // Do not let reads from the cloned object float above the arraycopy.
878 if (alloc != nullptr && !alloc->initialization()->does_not_escape()) {
879 // Do not let stores that initialize this object be reordered with
880 // a subsequent store that would make this object accessible by
881 // other threads.
882 insert_mem_bar(ctrl, &out_mem, Op_MemBarStoreStore);
883 } else {
884 insert_mem_bar(ctrl, &out_mem, Op_MemBarCPUOrder);
885 }
886
887 if (is_partial_array_copy) {
888 assert((*ctrl)->is_Proj(), "MemBar control projection");
889 assert((*ctrl)->in(0)->isa_MemBar(), "MemBar node");
890 (*ctrl)->in(0)->isa_MemBar()->set_trailing_partial_array_copy();
891 }
892
893 _igvn.replace_node(_callprojs->fallthrough_memproj, out_mem);
894 if (_callprojs->fallthrough_ioproj != nullptr) {
895 _igvn.replace_node(_callprojs->fallthrough_ioproj, *io);
896 }
897 _igvn.replace_node(_callprojs->fallthrough_catchproj, *ctrl);
898
899 #ifdef ASSERT
900 const TypeOopPtr* dest_t = _igvn.type(dest)->is_oopptr();
901 if (dest_t->is_known_instance() && !is_partial_array_copy) {
902 ArrayCopyNode* ac = nullptr;
903 assert(ArrayCopyNode::may_modify(dest_t, (*ctrl)->in(0)->as_MemBar(), &_igvn, ac), "dependency on arraycopy lost");
904 assert(ac == nullptr, "no arraycopy anymore");
905 }
906 #endif
907
908 return out_mem;
909 }
910
911 // Helper for initialization of arrays, creating a ClearArray.
912 // It writes zero bits in [start..end), within the body of an array object.
913 // The memory effects are all chained onto the 'adr_type' alias category.
914 //
915 // Since the object is otherwise uninitialized, we are free
916 // to put a little "slop" around the edges of the cleared area,
917 // as long as it does not go back into the array's header,
918 // or beyond the array end within the heap.
919 //
920 // The lower edge can be rounded down to the nearest jint and the
921 // upper edge can be rounded up to the nearest MinObjAlignmentInBytes.
922 //
923 // Arguments:
924 // adr_type memory slice where writes are generated
925 // dest oop of the destination array
926 // basic_elem_type element type of the destination
927 // slice_idx array index of first element to store
928 // slice_len number of elements to store (or null)
929 // dest_size total size in bytes of the array object
930 //
931 // Exactly one of slice_len or dest_size must be non-null.
932 // If dest_size is non-null, zeroing extends to the end of the object.
933 // If slice_len is non-null, the slice_idx value must be a constant.
934 void PhaseMacroExpand::generate_clear_array(Node* ctrl, MergeMemNode* merge_mem,
935 const TypePtr* adr_type,
936 Node* dest,
937 Node* val,
938 Node* raw_val,
939 BasicType basic_elem_type,
940 Node* slice_idx,
941 Node* slice_len,
942 Node* dest_size) {
943 // one or the other but not both of slice_len and dest_size:
944 assert((slice_len != nullptr? 1: 0) + (dest_size != nullptr? 1: 0) == 1, "");
945 if (slice_len == nullptr) slice_len = top();
946 if (dest_size == nullptr) dest_size = top();
947
948 uint alias_idx = C->get_alias_index(adr_type);
949
950 // operate on this memory slice:
951 Node* mem = merge_mem->memory_at(alias_idx); // memory slice to operate on
952
953 // scaling and rounding of indexes:
954 int scale = exact_log2(type2aelembytes(basic_elem_type));
955 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
956 int clear_low = (-1 << scale) & (BytesPerInt - 1);
957 int bump_bit = (-1 << scale) & BytesPerInt;
958
959 // determine constant starts and ends
960 const intptr_t BIG_NEG = -128;
961 assert(BIG_NEG + 2*abase < 0, "neg enough");
962 intptr_t slice_idx_con = (intptr_t) _igvn.find_int_con(slice_idx, BIG_NEG);
963 intptr_t slice_len_con = (intptr_t) _igvn.find_int_con(slice_len, BIG_NEG);
964 if (slice_len_con == 0) {
965 return; // nothing to do here
966 }
967 intptr_t start_con = (abase + (slice_idx_con << scale)) & ~clear_low;
968 intptr_t end_con = _igvn.find_intptr_t_con(dest_size, -1);
969 if (slice_idx_con >= 0 && slice_len_con >= 0) {
970 assert(end_con < 0, "not two cons");
971 end_con = align_up(abase + ((slice_idx_con + slice_len_con) << scale),
972 BytesPerLong);
973 }
974
975 if (start_con >= 0 && end_con >= 0) {
976 // Constant start and end. Simple.
977 mem = ClearArrayNode::clear_memory(ctrl, mem, dest, val, raw_val,
978 start_con, end_con, &_igvn);
979 } else if (start_con >= 0 && dest_size != top()) {
980 // Constant start, pre-rounded end after the tail of the array.
981 Node* end = dest_size;
982 mem = ClearArrayNode::clear_memory(ctrl, mem, dest, val, raw_val,
983 start_con, end, &_igvn);
984 } else if (start_con >= 0 && slice_len != top()) {
985 // Constant start, non-constant end. End needs rounding up.
986 // End offset = round_up(abase + ((slice_idx_con + slice_len) << scale), 8)
987 intptr_t end_base = abase + (slice_idx_con << scale);
988 int end_round = (-1 << scale) & (BytesPerLong - 1);
989 Node* end = ConvI2X(slice_len);
990 if (scale != 0)
991 end = transform_later(new LShiftXNode(end, intcon(scale) ));
992 end_base += end_round;
993 end = transform_later(new AddXNode(end, MakeConX(end_base)) );
994 end = transform_later(new AndXNode(end, MakeConX(~end_round)) );
995 mem = ClearArrayNode::clear_memory(ctrl, mem, dest, val, raw_val,
996 start_con, end, &_igvn);
997 } else if (start_con < 0 && dest_size != top()) {
998 // Non-constant start, pre-rounded end after the tail of the array.
999 // This is almost certainly a "round-to-end" operation.
1000 Node* start = slice_idx;
1001 start = ConvI2X(start);
1002 if (scale != 0)
1003 start = transform_later(new LShiftXNode( start, intcon(scale) ));
1004 start = transform_later(new AddXNode(start, MakeConX(abase)) );
1005 if ((bump_bit | clear_low) != 0) {
1006 int to_clear = (bump_bit | clear_low);
1007 // Align up mod 8, then store a jint zero unconditionally
1008 // just before the mod-8 boundary.
1009 if (((abase + bump_bit) & ~to_clear) - bump_bit
1010 < arrayOopDesc::length_offset_in_bytes() + BytesPerInt) {
1011 bump_bit = 0;
1012 assert((abase & to_clear) == 0, "array base must be long-aligned");
1013 } else {
1014 // Bump 'start' up to (or past) the next jint boundary:
1015 start = transform_later( new AddXNode(start, MakeConX(bump_bit)) );
1016 assert((abase & clear_low) == 0, "array base must be int-aligned");
1017 }
1018 // Round bumped 'start' down to jlong boundary in body of array.
1019 start = transform_later(new AndXNode(start, MakeConX(~to_clear)) );
1020 if (bump_bit != 0) {
1021 // Store a zero to the immediately preceding jint:
1022 Node* x1 = transform_later(new AddXNode(start, MakeConX(-bump_bit)) );
1023 Node* p1 = basic_plus_adr(dest, x1);
1024 if (val == nullptr) {
1025 assert(raw_val == nullptr, "val may not be null");
1026 mem = StoreNode::make(_igvn, ctrl, mem, p1, adr_type, intcon(0), T_INT, MemNode::unordered);
1027 } else {
1028 assert(_igvn.type(val)->isa_narrowoop(), "should be narrow oop");
1029 mem = new StoreNNode(ctrl, mem, p1, adr_type, val, MemNode::unordered);
1030 }
1031 mem = transform_later(mem);
1032 }
1033 }
1034 Node* end = dest_size; // pre-rounded
1035 mem = ClearArrayNode::clear_memory(ctrl, mem, dest, raw_val,
1036 start, end, &_igvn);
1037 } else {
1038 // Non-constant start, unrounded non-constant end.
1039 // (Nobody zeroes a random midsection of an array using this routine.)
1040 ShouldNotReachHere(); // fix caller
1041 }
1042
1043 // Done.
1044 merge_mem->set_memory_at(alias_idx, mem);
1045 }
1046
1047 bool PhaseMacroExpand::generate_block_arraycopy(Node** ctrl, MergeMemNode** mem, Node* io,
1048 const TypePtr* adr_type,
1049 BasicType basic_elem_type,
1050 AllocateNode* alloc,
1051 Node* src, Node* src_offset,
1052 Node* dest, Node* dest_offset,
1053 Node* dest_size, bool dest_uninitialized) {
1054 // See if there is an advantage from block transfer.
1055 int scale = exact_log2(type2aelembytes(basic_elem_type));
1131 const TypeFunc* call_type = OptoRuntime::slow_arraycopy_Type();
1132 CallNode* call = new CallStaticJavaNode(call_type, OptoRuntime::slow_arraycopy_Java(),
1133 "slow_arraycopy", TypePtr::BOTTOM);
1134
1135 call->init_req(TypeFunc::Control, *ctrl);
1136 call->init_req(TypeFunc::I_O , *io);
1137 call->init_req(TypeFunc::Memory , mem);
1138 call->init_req(TypeFunc::ReturnAdr, top());
1139 call->init_req(TypeFunc::FramePtr, top());
1140 call->init_req(TypeFunc::Parms+0, src);
1141 call->init_req(TypeFunc::Parms+1, src_offset);
1142 call->init_req(TypeFunc::Parms+2, dest);
1143 call->init_req(TypeFunc::Parms+3, dest_offset);
1144 call->init_req(TypeFunc::Parms+4, copy_length);
1145 call->copy_call_debug_info(&_igvn, ac);
1146
1147 call->set_cnt(PROB_UNLIKELY_MAG(4)); // Same effect as RC_UNCOMMON.
1148 _igvn.replace_node(ac, call);
1149 transform_later(call);
1150
1151 _callprojs = call->extract_projections(false /*separate_io_proj*/, false /*do_asserts*/);
1152 *ctrl = _callprojs->fallthrough_catchproj->clone();
1153 transform_later(*ctrl);
1154
1155 Node* m = _callprojs->fallthrough_memproj->clone();
1156 transform_later(m);
1157
1158 uint alias_idx = C->get_alias_index(adr_type);
1159 MergeMemNode* out_mem;
1160 if (alias_idx != Compile::AliasIdxBot) {
1161 out_mem = MergeMemNode::make(mem);
1162 out_mem->set_memory_at(alias_idx, m);
1163 } else {
1164 out_mem = MergeMemNode::make(m);
1165 }
1166 transform_later(out_mem);
1167
1168 // When src is negative and arraycopy is before an infinite loop,_callprojs.fallthrough_ioproj
1169 // could be nullptr. Skip clone and update nullptr fallthrough_ioproj.
1170 if (_callprojs->fallthrough_ioproj != nullptr) {
1171 *io = _callprojs->fallthrough_ioproj->clone();
1172 transform_later(*io);
1173 } else {
1174 *io = nullptr;
1175 }
1176
1177 return out_mem;
1178 }
1179
1180 // Helper function; generates code for cases requiring runtime checks.
1181 Node* PhaseMacroExpand::generate_checkcast_arraycopy(Node** ctrl, MergeMemNode** mem,
1182 const TypePtr* adr_type,
1183 Node* dest_elem_klass,
1184 Node* src, Node* src_offset,
1185 Node* dest, Node* dest_offset,
1186 Node* copy_length, bool dest_uninitialized) {
1187 if ((*ctrl)->is_top()) return nullptr;
1188
1189 address copyfunc_addr = StubRoutines::checkcast_arraycopy(dest_uninitialized);
1190 if (copyfunc_addr == nullptr) { // Stub was not generated, go slow path.
1191 return nullptr;
1283 if (exit_block) {
1284 exit_block->init_req(2, *ctrl);
1285
1286 // Memory edge corresponding to stub_region.
1287 result_memory->init_req(2, *mem);
1288
1289 uint alias_idx = C->get_alias_index(adr_type);
1290 if (alias_idx != Compile::AliasIdxBot) {
1291 *mem = MergeMemNode::make(*mem);
1292 (*mem)->set_memory_at(alias_idx, result_memory);
1293 } else {
1294 *mem = MergeMemNode::make(result_memory);
1295 }
1296 transform_later(*mem);
1297 *ctrl = exit_block;
1298 return true;
1299 }
1300 return false;
1301 }
1302
1303 const TypePtr* PhaseMacroExpand::adjust_for_flat_array(const TypeAryPtr* top_dest, Node*& src_offset,
1304 Node*& dest_offset, Node*& length, BasicType& dest_elem,
1305 Node*& dest_length) {
1306 #ifdef ASSERT
1307 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
1308 bool needs_barriers = top_dest->elem()->inline_klass()->contains_oops() &&
1309 bs->array_copy_requires_gc_barriers(dest_length != nullptr, T_OBJECT, false, false, BarrierSetC2::Optimization);
1310 assert(!needs_barriers || StressReflectiveCode, "Flat arracopy would require GC barriers");
1311 #endif
1312 int elem_size = top_dest->flat_elem_size();
1313 if (elem_size >= 8) {
1314 if (elem_size > 8) {
1315 // treat as array of long but scale length, src offset and dest offset
1316 assert((elem_size % 8) == 0, "not a power of 2?");
1317 int factor = elem_size / 8;
1318 length = transform_later(new MulINode(length, intcon(factor)));
1319 src_offset = transform_later(new MulINode(src_offset, intcon(factor)));
1320 dest_offset = transform_later(new MulINode(dest_offset, intcon(factor)));
1321 if (dest_length != nullptr) {
1322 dest_length = transform_later(new MulINode(dest_length, intcon(factor)));
1323 }
1324 elem_size = 8;
1325 }
1326 dest_elem = T_LONG;
1327 } else if (elem_size == 4) {
1328 dest_elem = T_INT;
1329 } else if (elem_size == 2) {
1330 dest_elem = T_CHAR;
1331 } else if (elem_size == 1) {
1332 dest_elem = T_BYTE;
1333 } else {
1334 ShouldNotReachHere();
1335 }
1336 return TypeRawPtr::BOTTOM;
1337 }
1338
1339 #undef XTOP
1340
1341 void PhaseMacroExpand::expand_arraycopy_node(ArrayCopyNode *ac) {
1342 Node* ctrl = ac->in(TypeFunc::Control);
1343 Node* io = ac->in(TypeFunc::I_O);
1344 Node* src = ac->in(ArrayCopyNode::Src);
1345 Node* src_offset = ac->in(ArrayCopyNode::SrcPos);
1346 Node* dest = ac->in(ArrayCopyNode::Dest);
1347 Node* dest_offset = ac->in(ArrayCopyNode::DestPos);
1348 Node* length = ac->in(ArrayCopyNode::Length);
1349 MergeMemNode* merge_mem = nullptr;
1350
1351 if (ac->is_clonebasic()) {
1352 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
1353 bs->clone_at_expansion(this, ac);
1354 return;
1355 } else if (ac->is_copyof() || ac->is_copyofrange() || ac->is_clone_oop_array()) {
1356 const Type* src_type = _igvn.type(src);
1357 const Type* dest_type = _igvn.type(dest);
1358 const TypeAryPtr* top_src = src_type->isa_aryptr();
1359 // Note: The destination could have type Object (i.e. non-array) when directly invoking the protected method
1360 // Object::clone() with reflection on a declared Object that is an array at runtime. top_dest is then null.
1361 const TypeAryPtr* top_dest = dest_type->isa_aryptr();
1362 BasicType dest_elem = T_OBJECT;
1363 if (top_dest != nullptr && top_dest->elem() != Type::BOTTOM) {
1364 dest_elem = top_dest->elem()->array_element_basic_type();
1365 }
1366 if (is_reference_type(dest_elem, true)) dest_elem = T_OBJECT;
1367
1368 if (top_src != nullptr && top_src->is_flat()) {
1369 // If src is flat, dest is guaranteed to be flat as well
1370 top_dest = top_src;
1371 }
1372
1373 AllocateArrayNode* alloc = nullptr;
1374 Node* dest_length = nullptr;
1375 if (ac->is_alloc_tightly_coupled()) {
1376 alloc = AllocateArrayNode::Ideal_array_allocation(dest);
1377 assert(alloc != nullptr, "expect alloc");
1378 dest_length = alloc->in(AllocateNode::ALength);
1379 }
1380
1381 Node* mem = ac->in(TypeFunc::Memory);
1382 const TypePtr* adr_type = nullptr;
1383 if (top_dest != nullptr && top_dest->is_flat()) {
1384 assert(dest_length != nullptr || StressReflectiveCode, "must be tightly coupled");
1385 // Copy to a flat array modifies multiple memory slices. Conservatively insert a barrier
1386 // on all slices to prevent writes into the source from floating below the arraycopy.
1387 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder);
1388 adr_type = adjust_for_flat_array(top_dest, src_offset, dest_offset, length, dest_elem, dest_length);
1389 } else {
1390 adr_type = dest_type->is_oopptr()->add_offset(Type::OffsetBot);
1391 if (ac->_dest_type != TypeOopPtr::BOTTOM) {
1392 adr_type = ac->_dest_type->add_offset(Type::OffsetBot)->is_ptr();
1393 }
1394 if (ac->_src_type != ac->_dest_type) {
1395 adr_type = TypeRawPtr::BOTTOM;
1396 }
1397 }
1398 merge_mem = MergeMemNode::make(mem);
1399 transform_later(merge_mem);
1400
1401 generate_arraycopy(ac, alloc, &ctrl, merge_mem, &io,
1402 adr_type, dest_elem,
1403 src, src_offset, dest, dest_offset, length,
1404 dest_length,
1405 true, ac->has_negative_length_guard());
1406
1407 return;
1408 }
1409
1410 AllocateArrayNode* alloc = nullptr;
1411 if (ac->is_alloc_tightly_coupled()) {
1412 alloc = AllocateArrayNode::Ideal_array_allocation(dest);
1413 assert(alloc != nullptr, "expect alloc");
1414 }
1415
1416 assert(ac->is_arraycopy() || ac->is_arraycopy_validated(), "should be an arraycopy");
1417
1418 // Compile time checks. If any of these checks cannot be verified at compile time,
1419 // we do not make a fast path for this call. Instead, we let the call remain as it
1420 // is. The checks we choose to mandate at compile time are:
1421 //
1422 // (1) src and dest are arrays.
1423 const Type* src_type = src->Value(&_igvn);
1424 const Type* dest_type = dest->Value(&_igvn);
1425 const TypeAryPtr* top_src = src_type->isa_aryptr();
1426 const TypeAryPtr* top_dest = dest_type->isa_aryptr();
1427
1428 BasicType src_elem = T_CONFLICT;
1429 BasicType dest_elem = T_CONFLICT;
1430
1431 if (top_src != nullptr && top_src->elem() != Type::BOTTOM) {
1432 src_elem = top_src->elem()->array_element_basic_type();
1433 }
1434 if (top_dest != nullptr && top_dest->elem() != Type::BOTTOM) {
1435 dest_elem = top_dest->elem()->array_element_basic_type();
1436 }
1437 if (is_reference_type(src_elem, true)) src_elem = T_OBJECT;
1438 if (is_reference_type(dest_elem, true)) dest_elem = T_OBJECT;
1439
1440 if (ac->is_arraycopy_validated() && dest_elem != T_CONFLICT && src_elem == T_CONFLICT) {
1441 src_elem = dest_elem;
1442 }
1443
1444 if (src_elem == T_CONFLICT || dest_elem == T_CONFLICT) {
1445 // Conservatively insert a memory barrier on all memory slices.
1446 // Do not let writes into the source float below the arraycopy.
1447 {
1448 Node* mem = ac->in(TypeFunc::Memory);
1449 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder);
1450
1451 merge_mem = MergeMemNode::make(mem);
1452 transform_later(merge_mem);
1453 }
1454
1455 // Call StubRoutines::generic_arraycopy stub.
1456 generate_arraycopy(ac, nullptr, &ctrl, merge_mem, &io,
1457 TypeRawPtr::BOTTOM, T_CONFLICT,
1458 src, src_offset, dest, dest_offset, length,
1459 nullptr,
1460 // If a negative length guard was generated for the ArrayCopyNode,
1461 // the length of the array can never be negative.
1462 false, ac->has_negative_length_guard());
1463 return;
1464 }
1465
1466 assert(!ac->is_arraycopy_validated() || (src_elem == dest_elem && dest_elem != T_VOID), "validated but different basic types");
1467
1468 // (2) src and dest arrays must have elements of the same BasicType
1469 // Figure out the size and type of the elements we will be copying.
1470 //
1471 // We have no stub to copy flat inline type arrays with oop
1472 // fields if we need to emit write barriers.
1473 //
1474 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
1475 if (src_elem != dest_elem || top_src->is_flat() != top_dest->is_flat() || dest_elem == T_VOID ||
1476 (top_src->is_flat() && top_dest->elem()->inline_klass()->contains_oops() &&
1477 bs->array_copy_requires_gc_barriers(alloc != nullptr, T_OBJECT, false, false, BarrierSetC2::Optimization))) {
1478 // The component types are not the same or are not recognized. Punt.
1479 // (But, avoid the native method wrapper to JVM_ArrayCopy.)
1480 {
1481 Node* mem = ac->in(TypeFunc::Memory);
1482 merge_mem = generate_slow_arraycopy(ac, &ctrl, mem, &io, TypePtr::BOTTOM, src, src_offset, dest, dest_offset, length, false);
1483 }
1484
1485 _igvn.replace_node(_callprojs->fallthrough_memproj, merge_mem);
1486 if (_callprojs->fallthrough_ioproj != nullptr) {
1487 _igvn.replace_node(_callprojs->fallthrough_ioproj, io);
1488 }
1489 _igvn.replace_node(_callprojs->fallthrough_catchproj, ctrl);
1490 return;
1491 }
1492
1493 //---------------------------------------------------------------------------
1494 // We will make a fast path for this call to arraycopy.
1495
1496 // We have the following tests left to perform:
1497 //
1498 // (3) src and dest must not be null.
1499 // (4) src_offset must not be negative.
1500 // (5) dest_offset must not be negative.
1501 // (6) length must not be negative.
1502 // (7) src_offset + length must not exceed length of src.
1503 // (8) dest_offset + length must not exceed length of dest.
1504 // (9) each element of an oop array must be assignable
1505
1506 Node* mem = ac->in(TypeFunc::Memory);
1507 if (top_dest->is_flat()) {
1508 // Copy to a flat array modifies multiple memory slices. Conservatively insert a barrier
1509 // on all slices to prevent writes into the source from floating below the arraycopy.
1510 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder);
1511 }
1512 merge_mem = MergeMemNode::make(mem);
1513 transform_later(merge_mem);
1514
1515 RegionNode* slow_region = new RegionNode(1);
1516 transform_later(slow_region);
1517
1518 if (!ac->is_arraycopy_validated()) {
1519 // (3) operands must not be null
1520 // We currently perform our null checks with the null_check routine.
1521 // This means that the null exceptions will be reported in the caller
1522 // rather than (correctly) reported inside of the native arraycopy call.
1523 // This should be corrected, given time. We do our null check with the
1524 // stack pointer restored.
1525 // null checks done library_call.cpp
1526
1527 // (4) src_offset must not be negative.
1528 generate_negative_guard(&ctrl, src_offset, slow_region);
1529
1530 // (5) dest_offset must not be negative.
1531 generate_negative_guard(&ctrl, dest_offset, slow_region);
1532
1533 // (6) length must not be negative (moved to generate_arraycopy()).
1534 // generate_negative_guard(length, slow_region);
1535
1536 // (7) src_offset + length must not exceed length of src.
1537 Node* alen = ac->in(ArrayCopyNode::SrcLen);
1538 assert(alen != nullptr, "need src len");
1539 generate_limit_guard(&ctrl,
1540 src_offset, length,
1541 alen,
1542 slow_region);
1543
1544 // (8) dest_offset + length must not exceed length of dest.
1545 alen = ac->in(ArrayCopyNode::DestLen);
1546 assert(alen != nullptr, "need dest len");
1547 generate_limit_guard(&ctrl,
1548 dest_offset, length,
1549 alen,
1550 slow_region);
1551
1552 // (9) each element of an oop array must be assignable
1553 // The generate_arraycopy subroutine checks this.
1554
1555 // Handle inline type arrays
1556 if (!top_src->is_flat()) {
1557 if (UseArrayFlattening && !top_src->is_not_flat()) {
1558 // Src might be flat and dest might not be flat. Go to the slow path if src is flat.
1559 generate_flat_array_guard(&ctrl, src, merge_mem, slow_region);
1560 }
1561 if (EnableValhalla) {
1562 // No validation. The subtype check emitted at macro expansion time will not go to the slow
1563 // path but call checkcast_arraycopy which can not handle flat/null-free inline type arrays.
1564 generate_null_free_array_guard(&ctrl, dest, merge_mem, slow_region);
1565 }
1566 } else {
1567 assert(top_dest->is_flat(), "dest array must be flat");
1568 }
1569 }
1570
1571 // This is where the memory effects are placed:
1572 const TypePtr* adr_type = nullptr;
1573 Node* dest_length = (alloc != nullptr) ? alloc->in(AllocateNode::ALength) : nullptr;
1574
1575 if (top_dest->is_flat()) {
1576 adr_type = adjust_for_flat_array(top_dest, src_offset, dest_offset, length, dest_elem, dest_length);
1577 } else if (ac->_dest_type != TypeOopPtr::BOTTOM) {
1578 adr_type = ac->_dest_type->add_offset(Type::OffsetBot)->is_ptr();
1579 } else {
1580 adr_type = TypeAryPtr::get_array_body_type(dest_elem);
1581 }
1582
1583 generate_arraycopy(ac, alloc, &ctrl, merge_mem, &io,
1584 adr_type, dest_elem,
1585 src, src_offset, dest, dest_offset, length,
1586 dest_length,
1587 // If a negative length guard was generated for the ArrayCopyNode,
1588 // the length of the array can never be negative.
1589 false, ac->has_negative_length_guard(),
1590 slow_region);
1591 }
|