src/share/vm/opto/callnode.cpp

Print this page
rev 3361 : 7173584: Implement arraycopy as a macro node
Summary: delay the conversion of arraycopy to stub calls to macro expansion
Reviewed-by:

*** 1685,1689 **** --- 1685,1728 ---- this->set_non_esc_obj(); } } return result; } + + ArrayCopyNode::ArrayCopyNode(Compile* C, bool alloc_tightly_coupled) + : CallNode(arraycopy_type(), NULL, TypeRawPtr::BOTTOM), _alloc_tightly_coupled(alloc_tightly_coupled), _kind(ArrayCopy) { + init_class_id(Class_ArrayCopy); + init_flags(Flag_is_macro); + C->add_macro_node(this); + } + + uint ArrayCopyNode::size_of() const { return sizeof(*this); } + + ArrayCopyNode* ArrayCopyNode::make(GraphKit* kit, bool may_throw, + Node* src, Node* src_offset, Node* dest, Node* dest_offset, Node* length, + bool alloc_tightly_coupled) { + + ArrayCopyNode* ac = new (kit->C, ParmLimit)ArrayCopyNode(kit->C, alloc_tightly_coupled); + Node* prev_mem = kit->set_predefined_input_for_runtime_call(ac); + + ac->init_req( ArrayCopyNode::Src, src); + ac->init_req( ArrayCopyNode::SrcPos, src_offset); + ac->init_req( ArrayCopyNode::Dest, dest); + ac->init_req( ArrayCopyNode::DestPos, dest_offset); + ac->init_req( ArrayCopyNode::Length, length); + + if (may_throw) { + ac->set_req( TypeFunc::I_O , kit->i_o() ); + kit->add_safepoint_edges(ac, false); + } + + return ac; + } + + void ArrayCopyNode::connect_outputs(GraphKit* kit) { + kit->set_all_memory_call(this, true); + kit->set_control(kit->gvn().transform( new (kit->C, 1) ProjNode(this,TypeFunc::Control) )); + kit->set_i_o(kit->gvn().transform(new (kit->C, 1) ProjNode(this, TypeFunc::I_O))); + kit->make_slow_call_ex(this, kit->env()->Throwable_klass(), true); + kit->set_all_memory_call(this); + } +