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