< prev index next >

src/hotspot/share/opto/arraycopynode.cpp

Print this page




 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   }


< prev index next >