< prev index next >

src/hotspot/share/opto/arraycopynode.cpp

Print this page

        

@@ -162,20 +162,20 @@
   Node* src = in(ArrayCopyNode::Src);
   Node* dest = in(ArrayCopyNode::Dest);
   Node* ctl = in(TypeFunc::Control);
   Node* in_mem = in(TypeFunc::Memory);
 
-  const Type* src_type = phase->type(src);
+  const Type* dest_type = phase->type(dest);
 
   assert(src->is_AddP(), "should be base + off");
   assert(dest->is_AddP(), "should be base + off");
   Node* base_src = src->in(AddPNode::Base);
   Node* base_dest = dest->in(AddPNode::Base);
 
   MergeMemNode* mem = MergeMemNode::make(in_mem);
 
-  const TypeInstPtr* inst_src = src_type->isa_instptr();
+  const TypeInstPtr* inst_src = dest_type->isa_instptr();
 
   if (inst_src == NULL) {
     return NULL;
   }
 

@@ -583,10 +583,21 @@
 
   if (count < 0 || count > ArrayCopyLoadStoreMaxElem) {
     return NULL;
   }
 
+  Node* src = in(ArrayCopyNode::Src);
+  Node* dest = in(ArrayCopyNode::Dest);
+  const Type* src_type = phase->type(src);
+  const Type* dest_type = phase->type(dest);
+
+  if (src_type->isa_aryptr() && dest_type->isa_instptr()) {
+    // clone used for load of unknown value type can't be optimized at
+    // this point
+    return NULL;
+  }
+
   Node* mem = try_clone_instance(phase, can_reshape, count);
   if (mem != NULL) {
     return (mem == NodeSentinel) ? NULL : mem;
   }
 

@@ -620,12 +631,10 @@
   }
   new_map->set_control(in(TypeFunc::Control));
   new_map->set_memory(MergeMemNode::make(in(TypeFunc::Memory)));
   new_map->set_i_o(in(TypeFunc::I_O));
 
-  Node* src = in(ArrayCopyNode::Src);
-  Node* dest = in(ArrayCopyNode::Dest);
   const TypeAryPtr* atp_src = get_address_type(phase, src);
   const TypeAryPtr* atp_dest = get_address_type(phase, dest);
   uint alias_idx_src = phase->C->get_alias_index(atp_src);
   uint alias_idx_dest = phase->C->get_alias_index(atp_dest);
 
< prev index next >