< prev index next >
src/hotspot/share/opto/arraycopynode.cpp
Print this page
*** 162,181 ****
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);
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();
if (inst_src == NULL) {
return NULL;
}
--- 162,181 ----
Node* src = in(ArrayCopyNode::Src);
Node* dest = in(ArrayCopyNode::Dest);
Node* ctl = in(TypeFunc::Control);
Node* in_mem = in(TypeFunc::Memory);
! 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 = dest_type->isa_instptr();
if (inst_src == NULL) {
return NULL;
}
*** 583,592 ****
--- 583,603 ----
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,631 ****
}
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);
--- 631,640 ----
< prev index next >