hotspot/src/share/vm/opto/callnode.cpp
changeset 26166 4b49fd58bbd9
parent 25935 59b08808cb9c
child 26180 2fbed11af70e
equal deleted inserted replaced
25938:d1161ea75e14 26166:4b49fd58bbd9
  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