hotspot/src/share/vm/opto/macro.cpp
changeset 30244 d4e471395ff5
parent 29086 74100114a95a
child 30248 5c6dacbd17ae
equal deleted inserted replaced
30240:a7ba42fa1df6 30244:d4e471395ff5
   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");