src/share/vm/opto/escape.cpp

changeset 3311
1bd45abaa507
parent 3309
8c57262447d3
child 3318
cc81b9c09bbb
     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        }

mercurial