142 call->init_req( TypeFunc::ReturnAdr, oldcall->in( TypeFunc::ReturnAdr ) ); |
142 call->init_req( TypeFunc::ReturnAdr, oldcall->in( TypeFunc::ReturnAdr ) ); |
143 call->init_req( TypeFunc::FramePtr, oldcall->in( TypeFunc::FramePtr ) ); |
143 call->init_req( TypeFunc::FramePtr, oldcall->in( TypeFunc::FramePtr ) ); |
144 } |
144 } |
145 |
145 |
146 //------------------------------make_slow_call--------------------------------- |
146 //------------------------------make_slow_call--------------------------------- |
147 CallNode* PhaseMacroExpand::make_slow_call(CallNode *oldcall, const TypeFunc* slow_call_type, address slow_call, const char* leaf_name, Node* slow_path, Node* parm0, Node* parm1) { |
147 CallNode* PhaseMacroExpand::make_slow_call(CallNode *oldcall, const TypeFunc* slow_call_type, |
|
148 address slow_call, const char* leaf_name, Node* slow_path, |
|
149 Node* parm0, Node* parm1, Node* parm2) { |
148 |
150 |
149 // Slow-path call |
151 // Slow-path call |
150 CallNode *call = leaf_name |
152 CallNode *call = leaf_name |
151 ? (CallNode*)new CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM ) |
153 ? (CallNode*)new CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM ) |
152 : (CallNode*)new CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM ); |
154 : (CallNode*)new CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM ); |
153 |
155 |
154 // Slow path call has no side-effects, uses few values |
156 // Slow path call has no side-effects, uses few values |
155 copy_predefined_input_for_runtime_call(slow_path, oldcall, call ); |
157 copy_predefined_input_for_runtime_call(slow_path, oldcall, call ); |
156 if (parm0 != NULL) call->init_req(TypeFunc::Parms+0, parm0); |
158 if (parm0 != NULL) call->init_req(TypeFunc::Parms+0, parm0); |
157 if (parm1 != NULL) call->init_req(TypeFunc::Parms+1, parm1); |
159 if (parm1 != NULL) call->init_req(TypeFunc::Parms+1, parm1); |
|
160 if (parm2 != NULL) call->init_req(TypeFunc::Parms+2, parm2); |
158 copy_call_debug_info(oldcall, call); |
161 copy_call_debug_info(oldcall, call); |
159 call->set_cnt(PROB_UNLIKELY_MAG(4)); // Same effect as RC_UNCOMMON. |
162 call->set_cnt(PROB_UNLIKELY_MAG(4)); // Same effect as RC_UNCOMMON. |
160 _igvn.replace_node(oldcall, call); |
163 _igvn.replace_node(oldcall, call); |
161 transform_later(call); |
164 transform_later(call); |
162 |
165 |
2326 slow_path = opt_bits_test(ctrl, region, 2, flock, 0, 0); |
2329 slow_path = opt_bits_test(ctrl, region, 2, flock, 0, 0); |
2327 mem_phi->init_req(2, mem); |
2330 mem_phi->init_req(2, mem); |
2328 } |
2331 } |
2329 |
2332 |
2330 // Make slow path call |
2333 // Make slow path call |
2331 CallNode *call = make_slow_call( (CallNode *) lock, OptoRuntime::complete_monitor_enter_Type(), OptoRuntime::complete_monitor_locking_Java(), NULL, slow_path, obj, box ); |
2334 CallNode *call = make_slow_call((CallNode *) lock, OptoRuntime::complete_monitor_enter_Type(), |
|
2335 OptoRuntime::complete_monitor_locking_Java(), NULL, slow_path, |
|
2336 obj, box, NULL); |
2332 |
2337 |
2333 extract_call_projections(call); |
2338 extract_call_projections(call); |
2334 |
2339 |
2335 // Slow path can only throw asynchronous exceptions, which are always |
2340 // Slow path can only throw asynchronous exceptions, which are always |
2336 // de-opted. So the compiler thinks the slow-call can never throw an |
2341 // de-opted. So the compiler thinks the slow-call can never throw an |
2393 |
2398 |
2394 FastUnlockNode *funlock = new FastUnlockNode( ctrl, obj, box ); |
2399 FastUnlockNode *funlock = new FastUnlockNode( ctrl, obj, box ); |
2395 funlock = transform_later( funlock )->as_FastUnlock(); |
2400 funlock = transform_later( funlock )->as_FastUnlock(); |
2396 // Optimize test; set region slot 2 |
2401 // Optimize test; set region slot 2 |
2397 Node *slow_path = opt_bits_test(ctrl, region, 2, funlock, 0, 0); |
2402 Node *slow_path = opt_bits_test(ctrl, region, 2, funlock, 0, 0); |
2398 |
2403 Node *thread = transform_later(new ThreadLocalNode()); |
2399 CallNode *call = make_slow_call( (CallNode *) unlock, OptoRuntime::complete_monitor_exit_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C), "complete_monitor_unlocking_C", slow_path, obj, box ); |
2404 |
|
2405 CallNode *call = make_slow_call((CallNode *) unlock, OptoRuntime::complete_monitor_exit_Type(), |
|
2406 CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C), |
|
2407 "complete_monitor_unlocking_C", slow_path, obj, box, thread); |
2400 |
2408 |
2401 extract_call_projections(call); |
2409 extract_call_projections(call); |
2402 |
2410 |
2403 assert ( _ioproj_fallthrough == NULL && _ioproj_catchall == NULL && |
2411 assert ( _ioproj_fallthrough == NULL && _ioproj_catchall == NULL && |
2404 _memproj_catchall == NULL && _catchallcatchproj == NULL, "Unexpected projection from Lock"); |
2412 _memproj_catchall == NULL && _catchallcatchproj == NULL, "Unexpected projection from Lock"); |