3574 MemBarNode* mb = MemBarNode::make(C, Op_MemBarVolatile, Compile::AliasIdxRaw); 3575 mb->init_req(TypeFunc::Control, control()); 3576 mb->init_req(TypeFunc::Memory, mem); 3577 Node* membar = _gvn.transform(mb); 3578 set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); 3579 Node* newmem = _gvn.transform(new ProjNode(membar, TypeFunc::Memory)); 3580 set_all_memory(mem); 3581 set_memory(newmem, Compile::AliasIdxRaw); 3582 } 3583 3584 //------------------------------shared_lock------------------------------------ 3585 // Emit locking code. 3586 FastLockNode* GraphKit::shared_lock(Node* obj) { 3587 // bci is either a monitorenter bc or InvocationEntryBci 3588 // %%% SynchronizationEntryBCI is redundant; use InvocationEntryBci in interfaces 3589 assert(SynchronizationEntryBCI == InvocationEntryBci, ""); 3590 3591 if( !GenerateSynchronizationCode ) 3592 return NULL; // Not locking things? 3593 3594 // We cannot lock on a value type 3595 const TypeOopPtr* objptr = _gvn.type(obj)->make_oopptr(); 3596 if (objptr->can_be_value_type()) { 3597 gen_value_type_guard(obj, 1); 3598 } 3599 3600 if (stopped()) // Dead monitor? 3601 return NULL; 3602 3603 assert(dead_locals_are_killed(), "should kill locals before sync. point"); 3604 3605 obj = access_resolve(obj, ACCESS_READ | ACCESS_WRITE); 3606 3607 // Box the stack location 3608 Node* box = _gvn.transform(new BoxLockNode(next_monitor())); 3609 Node* mem = reset_memory(); 3610 3611 FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock(); 3612 if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) { 3613 // Create the counters for this fast lock. 3614 flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci 3615 } 3616 3617 // Create the rtm counters for this fast lock if needed. 3618 flock->create_rtm_lock_counter(sync_jvms()); // sync_jvms used to get current bci 3619 | 3574 MemBarNode* mb = MemBarNode::make(C, Op_MemBarVolatile, Compile::AliasIdxRaw); 3575 mb->init_req(TypeFunc::Control, control()); 3576 mb->init_req(TypeFunc::Memory, mem); 3577 Node* membar = _gvn.transform(mb); 3578 set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); 3579 Node* newmem = _gvn.transform(new ProjNode(membar, TypeFunc::Memory)); 3580 set_all_memory(mem); 3581 set_memory(newmem, Compile::AliasIdxRaw); 3582 } 3583 3584 //------------------------------shared_lock------------------------------------ 3585 // Emit locking code. 3586 FastLockNode* GraphKit::shared_lock(Node* obj) { 3587 // bci is either a monitorenter bc or InvocationEntryBci 3588 // %%% SynchronizationEntryBCI is redundant; use InvocationEntryBci in interfaces 3589 assert(SynchronizationEntryBCI == InvocationEntryBci, ""); 3590 3591 if( !GenerateSynchronizationCode ) 3592 return NULL; // Not locking things? 3593 3594 if (stopped()) // Dead monitor? 3595 return NULL; 3596 3597 assert(dead_locals_are_killed(), "should kill locals before sync. point"); 3598 3599 obj = access_resolve(obj, ACCESS_READ | ACCESS_WRITE); 3600 3601 // Box the stack location 3602 Node* box = _gvn.transform(new BoxLockNode(next_monitor())); 3603 Node* mem = reset_memory(); 3604 3605 FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock(); 3606 if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) { 3607 // Create the counters for this fast lock. 3608 flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci 3609 } 3610 3611 // Create the rtm counters for this fast lock if needed. 3612 flock->create_rtm_lock_counter(sync_jvms()); // sync_jvms used to get current bci 3613 |