1813 this->set_non_esc_obj(); |
1813 this->set_non_esc_obj(); |
1814 } |
1814 } |
1815 } |
1815 } |
1816 return result; |
1816 return result; |
1817 } |
1817 } |
|
1818 |
|
1819 ArrayCopyNode::ArrayCopyNode(Compile* C, bool alloc_tightly_coupled) |
|
1820 : CallNode(arraycopy_type(), NULL, TypeRawPtr::BOTTOM), _alloc_tightly_coupled(alloc_tightly_coupled), _kind(ArrayCopy) { |
|
1821 init_class_id(Class_ArrayCopy); |
|
1822 init_flags(Flag_is_macro); |
|
1823 C->add_macro_node(this); |
|
1824 } |
|
1825 |
|
1826 uint ArrayCopyNode::size_of() const { return sizeof(*this); } |
|
1827 |
|
1828 ArrayCopyNode* ArrayCopyNode::make(GraphKit* kit, bool may_throw, |
|
1829 Node* src, Node* src_offset, Node* dest, Node* dest_offset, Node* length, |
|
1830 bool alloc_tightly_coupled) { |
|
1831 |
|
1832 ArrayCopyNode* ac = new ArrayCopyNode(kit->C, alloc_tightly_coupled); |
|
1833 Node* prev_mem = kit->set_predefined_input_for_runtime_call(ac); |
|
1834 |
|
1835 ac->init_req( ArrayCopyNode::Src, src); |
|
1836 ac->init_req( ArrayCopyNode::SrcPos, src_offset); |
|
1837 ac->init_req( ArrayCopyNode::Dest, dest); |
|
1838 ac->init_req( ArrayCopyNode::DestPos, dest_offset); |
|
1839 ac->init_req( ArrayCopyNode::Length, length); |
|
1840 |
|
1841 if (may_throw) { |
|
1842 ac->set_req(TypeFunc::I_O , kit->i_o()); |
|
1843 kit->add_safepoint_edges(ac, false); |
|
1844 } |
|
1845 |
|
1846 return ac; |
|
1847 } |
|
1848 |
|
1849 void ArrayCopyNode::connect_outputs(GraphKit* kit) { |
|
1850 kit->set_all_memory_call(this, true); |
|
1851 kit->set_control(kit->gvn().transform(new ProjNode(this,TypeFunc::Control))); |
|
1852 kit->set_i_o(kit->gvn().transform(new ProjNode(this, TypeFunc::I_O))); |
|
1853 kit->make_slow_call_ex(this, kit->env()->Throwable_klass(), true); |
|
1854 kit->set_all_memory_call(this); |
|
1855 } |
|
1856 |
|
1857 #ifndef PRODUCT |
|
1858 const char* ArrayCopyNode::_kind_names[] = {"arraycopy", "arraycopy, validated arguments", "clone", "oop array clone", "CopyOf", "CopyOfRange"}; |
|
1859 void ArrayCopyNode::dump_spec(outputStream *st) const { |
|
1860 CallNode::dump_spec(st); |
|
1861 st->print(" (%s%s)", _kind_names[_kind], _alloc_tightly_coupled ? ", tightly coupled allocation" : ""); |
|
1862 } |
|
1863 #endif |