src/share/vm/opto/graphKit.cpp

changeset 9738
18fd6d87f16f
parent 8653
0ffee573412b
child 9756
2be326848943
child 9942
eddd586d1a4c
equal deleted inserted replaced
9737:c06dc174d786 9738:18fd6d87f16f
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);

mercurial