1785 // have a card mark store and its barrier split across the GC point from |
1785 // have a card mark store and its barrier split across the GC point from |
1786 // either above or below. Here I get that to happen by reading ALL of memory. |
1786 // either above or below. Here I get that to happen by reading ALL of memory. |
1787 // A better answer would be to separate out card marks from other memory. |
1787 // A better answer would be to separate out card marks from other memory. |
1788 // For now, return the input memory state, so that it can be reused |
1788 // For now, return the input memory state, so that it can be reused |
1789 // after the call, if this call has restricted memory effects. |
1789 // after the call, if this call has restricted memory effects. |
1790 Node* GraphKit::set_predefined_input_for_runtime_call(SafePointNode* call) { |
1790 Node* GraphKit::set_predefined_input_for_runtime_call(SafePointNode* call, Node* narrow_mem) { |
1791 // Set fixed predefined input arguments |
1791 // Set fixed predefined input arguments |
1792 Node* memory = reset_memory(); |
1792 Node* memory = reset_memory(); |
|
1793 Node* m = narrow_mem == NULL ? memory : narrow_mem; |
1793 call->init_req( TypeFunc::Control, control() ); |
1794 call->init_req( TypeFunc::Control, control() ); |
1794 call->init_req( TypeFunc::I_O, top() ); // does no i/o |
1795 call->init_req( TypeFunc::I_O, top() ); // does no i/o |
1795 call->init_req( TypeFunc::Memory, memory ); // may gc ptrs |
1796 call->init_req( TypeFunc::Memory, m ); // may gc ptrs |
1796 call->init_req( TypeFunc::FramePtr, frameptr() ); |
1797 call->init_req( TypeFunc::FramePtr, frameptr() ); |
1797 call->init_req( TypeFunc::ReturnAdr, top() ); |
1798 call->init_req( TypeFunc::ReturnAdr, top() ); |
1798 return memory; |
1799 return memory; |
1799 } |
1800 } |
1800 |
1801 |
2380 if (wide_in) { |
2381 if (wide_in) { |
2381 prev_mem = set_predefined_input_for_runtime_call(call); |
2382 prev_mem = set_predefined_input_for_runtime_call(call); |
2382 } else { |
2383 } else { |
2383 assert(!wide_out, "narrow in => narrow out"); |
2384 assert(!wide_out, "narrow in => narrow out"); |
2384 Node* narrow_mem = memory(adr_type); |
2385 Node* narrow_mem = memory(adr_type); |
2385 prev_mem = reset_memory(); |
2386 prev_mem = set_predefined_input_for_runtime_call(call, narrow_mem); |
2386 map()->set_memory(narrow_mem); |
|
2387 set_predefined_input_for_runtime_call(call); |
|
2388 } |
2387 } |
2389 |
2388 |
2390 // Hook each parm in order. Stop looking at the first NULL. |
2389 // Hook each parm in order. Stop looking at the first NULL. |
2391 if (parm0 != NULL) { call->init_req(TypeFunc::Parms+0, parm0); |
2390 if (parm0 != NULL) { call->init_req(TypeFunc::Parms+0, parm0); |
2392 if (parm1 != NULL) { call->init_req(TypeFunc::Parms+1, parm1); |
2391 if (parm1 != NULL) { call->init_req(TypeFunc::Parms+1, parm1); |