1.1 --- a/src/share/vm/opto/escape.cpp Wed Nov 16 01:39:50 2011 -0800 1.2 +++ b/src/share/vm/opto/escape.cpp Wed Nov 16 09:13:57 2011 -0800 1.3 @@ -1772,12 +1772,20 @@ 1.4 Node *n = C->macro_node(i); 1.5 if (n->is_AbstractLock()) { // Lock and Unlock nodes 1.6 AbstractLockNode* alock = n->as_AbstractLock(); 1.7 - if (!alock->is_eliminated()) { 1.8 + if (!alock->is_eliminated() || alock->is_coarsened()) { 1.9 PointsToNode::EscapeState es = escape_state(alock->obj_node()); 1.10 assert(es != PointsToNode::UnknownEscape, "should know"); 1.11 if (es != PointsToNode::UnknownEscape && es != PointsToNode::GlobalEscape) { 1.12 - // Mark it eliminated 1.13 - alock->set_eliminated(); 1.14 + if (!alock->is_eliminated()) { 1.15 + // Mark it eliminated to update any counters 1.16 + alock->set_eliminated(); 1.17 + } else { 1.18 + // The lock could be marked eliminated by lock coarsening 1.19 + // code during first IGVN before EA. Clear coarsened flag 1.20 + // to eliminate all associated locks/unlocks and relock 1.21 + // during deoptimization. 1.22 + alock->clear_coarsened(); 1.23 + } 1.24 } 1.25 } 1.26 }