src/hotspot/share/opto/graphKit.cpp
changeset 52074 755b367c2134
parent 51880 ec4c3c287ca7
child 52224 4f2215a00ed1
equal deleted inserted replaced
52073:1c8745e31fa3 52074:755b367c2134
  1802 // have a card mark store and its barrier split across the GC point from
  1802 // have a card mark store and its barrier split across the GC point from
  1803 // either above or below.  Here I get that to happen by reading ALL of memory.
  1803 // either above or below.  Here I get that to happen by reading ALL of memory.
  1804 // A better answer would be to separate out card marks from other memory.
  1804 // A better answer would be to separate out card marks from other memory.
  1805 // For now, return the input memory state, so that it can be reused
  1805 // For now, return the input memory state, so that it can be reused
  1806 // after the call, if this call has restricted memory effects.
  1806 // after the call, if this call has restricted memory effects.
  1807 Node* GraphKit::set_predefined_input_for_runtime_call(SafePointNode* call) {
  1807 Node* GraphKit::set_predefined_input_for_runtime_call(SafePointNode* call, Node* narrow_mem) {
  1808   // Set fixed predefined input arguments
  1808   // Set fixed predefined input arguments
  1809   Node* memory = reset_memory();
  1809   Node* memory = reset_memory();
       
  1810   Node* m = narrow_mem == NULL ? memory : narrow_mem;
  1810   call->init_req( TypeFunc::Control,   control()  );
  1811   call->init_req( TypeFunc::Control,   control()  );
  1811   call->init_req( TypeFunc::I_O,       top()      ); // does no i/o
  1812   call->init_req( TypeFunc::I_O,       top()      ); // does no i/o
  1812   call->init_req( TypeFunc::Memory,    memory     ); // may gc ptrs
  1813   call->init_req( TypeFunc::Memory,    m          ); // may gc ptrs
  1813   call->init_req( TypeFunc::FramePtr,  frameptr() );
  1814   call->init_req( TypeFunc::FramePtr,  frameptr() );
  1814   call->init_req( TypeFunc::ReturnAdr, top()      );
  1815   call->init_req( TypeFunc::ReturnAdr, top()      );
  1815   return memory;
  1816   return memory;
  1816 }
  1817 }
  1817 
  1818 
  2463   if (wide_in) {
  2464   if (wide_in) {
  2464     prev_mem = set_predefined_input_for_runtime_call(call);
  2465     prev_mem = set_predefined_input_for_runtime_call(call);
  2465   } else {
  2466   } else {
  2466     assert(!wide_out, "narrow in => narrow out");
  2467     assert(!wide_out, "narrow in => narrow out");
  2467     Node* narrow_mem = memory(adr_type);
  2468     Node* narrow_mem = memory(adr_type);
  2468     prev_mem = reset_memory();
  2469     prev_mem = set_predefined_input_for_runtime_call(call, narrow_mem);
  2469     map()->set_memory(narrow_mem);
       
  2470     set_predefined_input_for_runtime_call(call);
       
  2471   }
  2470   }
  2472 
  2471 
  2473   // Hook each parm in order.  Stop looking at the first NULL.
  2472   // Hook each parm in order.  Stop looking at the first NULL.
  2474   if (parm0 != NULL) { call->init_req(TypeFunc::Parms+0, parm0);
  2473   if (parm0 != NULL) { call->init_req(TypeFunc::Parms+0, parm0);
  2475   if (parm1 != NULL) { call->init_req(TypeFunc::Parms+1, parm1);
  2474   if (parm1 != NULL) { call->init_req(TypeFunc::Parms+1, parm1);