< prev index next >

src/share/vm/opto/arraycopynode.cpp

Print this page
rev 12673 : 8176505: Wrong assertion 'should be an array copy/clone' in arraycopynode.cpp


 208   if (!finish_transform(phase, can_reshape, ctl, mem)) {
 209     // Return NodeSentinel to indicate that the transform failed
 210     return NodeSentinel;
 211   }
 212 
 213   return mem;
 214 }
 215 
 216 bool ArrayCopyNode::prepare_array_copy(PhaseGVN *phase, bool can_reshape,
 217                                        Node*& adr_src,
 218                                        Node*& base_src,
 219                                        Node*& adr_dest,
 220                                        Node*& base_dest,
 221                                        BasicType& copy_type,
 222                                        const Type*& value_type,
 223                                        bool& disjoint_bases) {
 224   Node* src = in(ArrayCopyNode::Src);
 225   Node* dest = in(ArrayCopyNode::Dest);
 226   const Type* src_type = phase->type(src);
 227   const TypeAryPtr* ary_src = src_type->isa_aryptr();
 228   assert(ary_src != NULL, "should be an array copy/clone");
 229 
 230   if (is_arraycopy() || is_copyofrange() || is_copyof()) {
 231     const Type* dest_type = phase->type(dest);
 232     const TypeAryPtr* ary_dest = dest_type->isa_aryptr();
 233     Node* src_offset = in(ArrayCopyNode::SrcPos);
 234     Node* dest_offset = in(ArrayCopyNode::DestPos);
 235 
 236     // newly allocated object is guaranteed to not overlap with source object
 237     disjoint_bases = is_alloc_tightly_coupled();
 238 
 239     if (ary_src  == NULL || ary_src->klass()  == NULL ||
 240         ary_dest == NULL || ary_dest->klass() == NULL) {
 241       // We don't know if arguments are arrays
 242       return false;
 243     }
 244 
 245     BasicType src_elem  = ary_src->klass()->as_array_klass()->element_type()->basic_type();
 246     BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type();
 247     if (src_elem  == T_ARRAY)  src_elem  = T_OBJECT;
 248     if (dest_elem == T_ARRAY)  dest_elem = T_OBJECT;




 208   if (!finish_transform(phase, can_reshape, ctl, mem)) {
 209     // Return NodeSentinel to indicate that the transform failed
 210     return NodeSentinel;
 211   }
 212 
 213   return mem;
 214 }
 215 
 216 bool ArrayCopyNode::prepare_array_copy(PhaseGVN *phase, bool can_reshape,
 217                                        Node*& adr_src,
 218                                        Node*& base_src,
 219                                        Node*& adr_dest,
 220                                        Node*& base_dest,
 221                                        BasicType& copy_type,
 222                                        const Type*& value_type,
 223                                        bool& disjoint_bases) {
 224   Node* src = in(ArrayCopyNode::Src);
 225   Node* dest = in(ArrayCopyNode::Dest);
 226   const Type* src_type = phase->type(src);
 227   const TypeAryPtr* ary_src = src_type->isa_aryptr();

 228 
 229   if (is_arraycopy() || is_copyofrange() || is_copyof()) {
 230     const Type* dest_type = phase->type(dest);
 231     const TypeAryPtr* ary_dest = dest_type->isa_aryptr();
 232     Node* src_offset = in(ArrayCopyNode::SrcPos);
 233     Node* dest_offset = in(ArrayCopyNode::DestPos);
 234 
 235     // newly allocated object is guaranteed to not overlap with source object
 236     disjoint_bases = is_alloc_tightly_coupled();
 237 
 238     if (ary_src  == NULL || ary_src->klass()  == NULL ||
 239         ary_dest == NULL || ary_dest->klass() == NULL) {
 240       // We don't know if arguments are arrays
 241       return false;
 242     }
 243 
 244     BasicType src_elem  = ary_src->klass()->as_array_klass()->element_type()->basic_type();
 245     BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type();
 246     if (src_elem  == T_ARRAY)  src_elem  = T_OBJECT;
 247     if (dest_elem == T_ARRAY)  dest_elem = T_OBJECT;


< prev index next >