< 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 >