344
345 Node* ArrayCopyNode::array_copy_forward(PhaseGVN *phase,
346 bool can_reshape,
347 Node* forward_ctl,
348 Node* start_mem_src,
349 Node* start_mem_dest,
350 const TypePtr* atp_src,
351 const TypePtr* atp_dest,
352 Node* adr_src,
353 Node* base_src,
354 Node* adr_dest,
355 Node* base_dest,
356 BasicType copy_type,
357 const Type* value_type,
358 int count) {
359 Node* mem = phase->C->top();
360 if (!forward_ctl->is_top()) {
361 // copy forward
362 mem = start_mem_dest;
363
364 if (count > 0) {
365 Node* v = LoadNode::make(*phase, forward_ctl, start_mem_src, adr_src, atp_src, value_type, copy_type, MemNode::unordered);
366 v = phase->transform(v);
367 mem = StoreNode::make(*phase, forward_ctl, mem, adr_dest, atp_dest, v, copy_type, MemNode::unordered);
368 mem = phase->transform(mem);
369 for (int i = 1; i < count; i++) {
370 Node* off = phase->MakeConX(type2aelembytes(copy_type) * i);
371 Node* next_src = phase->transform(new AddPNode(base_src,adr_src,off));
372 Node* next_dest = phase->transform(new AddPNode(base_dest,adr_dest,off));
373 v = LoadNode::make(*phase, forward_ctl, mem, next_src, atp_src, value_type, copy_type, MemNode::unordered);
374 v = phase->transform(v);
375 mem = StoreNode::make(*phase, forward_ctl,mem,next_dest,atp_dest,v, copy_type, MemNode::unordered);
376 mem = phase->transform(mem);
377 }
378 } else if(can_reshape) {
379 PhaseIterGVN* igvn = phase->is_IterGVN();
380 igvn->_worklist.push(adr_src);
381 igvn->_worklist.push(adr_dest);
382 }
383 }
|
344
345 Node* ArrayCopyNode::array_copy_forward(PhaseGVN *phase,
346 bool can_reshape,
347 Node* forward_ctl,
348 Node* start_mem_src,
349 Node* start_mem_dest,
350 const TypePtr* atp_src,
351 const TypePtr* atp_dest,
352 Node* adr_src,
353 Node* base_src,
354 Node* adr_dest,
355 Node* base_dest,
356 BasicType copy_type,
357 const Type* value_type,
358 int count) {
359 Node* mem = phase->C->top();
360 if (!forward_ctl->is_top()) {
361 // copy forward
362 mem = start_mem_dest;
363
364 // FYI: linked LoadUBs/StoreBs are created here
365 if (count > 0) {
366 Node* v = LoadNode::make(*phase, forward_ctl, start_mem_src, adr_src, atp_src, value_type, copy_type, MemNode::unordered);
367 v = phase->transform(v);
368 mem = StoreNode::make(*phase, forward_ctl, mem, adr_dest, atp_dest, v, copy_type, MemNode::unordered);
369 mem = phase->transform(mem);
370 for (int i = 1; i < count; i++) {
371 Node* off = phase->MakeConX(type2aelembytes(copy_type) * i);
372 Node* next_src = phase->transform(new AddPNode(base_src,adr_src,off));
373 Node* next_dest = phase->transform(new AddPNode(base_dest,adr_dest,off));
374 v = LoadNode::make(*phase, forward_ctl, mem, next_src, atp_src, value_type, copy_type, MemNode::unordered);
375 v = phase->transform(v);
376 mem = StoreNode::make(*phase, forward_ctl,mem,next_dest,atp_dest,v, copy_type, MemNode::unordered);
377 mem = phase->transform(mem);
378 }
379 } else if(can_reshape) {
380 PhaseIterGVN* igvn = phase->is_IterGVN();
381 igvn->_worklist.push(adr_src);
382 igvn->_worklist.push(adr_dest);
383 }
384 }
|