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);
+ }
+