hotspot/src/share/vm/opto/macro.cpp
changeset 11446 fd87432a895b
parent 11445 3c768dca60f5
child 11458 5ba160829cef
equal deleted inserted replaced
11445:3c768dca60f5 11446:fd87432a895b
  1816       Node* u = oldbox->raw_out(i);
  1816       Node* u = oldbox->raw_out(i);
  1817       if (u->is_AbstractLock() && !u->as_AbstractLock()->is_non_esc_obj()) {
  1817       if (u->is_AbstractLock() && !u->as_AbstractLock()->is_non_esc_obj()) {
  1818         AbstractLockNode* alock = u->as_AbstractLock();
  1818         AbstractLockNode* alock = u->as_AbstractLock();
  1819         // Check lock's box since box could be referenced by Lock's debug info.
  1819         // Check lock's box since box could be referenced by Lock's debug info.
  1820         if (alock->box_node() == oldbox) {
  1820         if (alock->box_node() == oldbox) {
  1821           assert(alock->obj_node() == obj, "");
  1821           assert(alock->obj_node()->eqv_uncast(obj), "");
  1822           // Mark eliminated all related locks and unlocks.
  1822           // Mark eliminated all related locks and unlocks.
  1823           alock->set_non_esc_obj();
  1823           alock->set_non_esc_obj();
  1824         }
  1824         }
  1825       }
  1825       }
  1826     }
  1826     }
  1843     bool next_edge = true;
  1843     bool next_edge = true;
  1844 
  1844 
  1845     Node* u = oldbox->raw_out(i);
  1845     Node* u = oldbox->raw_out(i);
  1846     if (u->is_AbstractLock()) {
  1846     if (u->is_AbstractLock()) {
  1847       AbstractLockNode* alock = u->as_AbstractLock();
  1847       AbstractLockNode* alock = u->as_AbstractLock();
  1848       if (alock->obj_node() == obj && alock->box_node() == oldbox) {
  1848       if (alock->box_node() == oldbox && alock->obj_node()->eqv_uncast(obj)) {
  1849         // Replace Box and mark eliminated all related locks and unlocks.
  1849         // Replace Box and mark eliminated all related locks and unlocks.
  1850         alock->set_non_esc_obj();
  1850         alock->set_non_esc_obj();
  1851         _igvn.hash_delete(alock);
  1851         _igvn.hash_delete(alock);
  1852         alock->set_box_node(newbox);
  1852         alock->set_box_node(newbox);
  1853         _igvn._worklist.push(alock);
  1853         _igvn._worklist.push(alock);
  1854         next_edge = false;
  1854         next_edge = false;
  1855       }
  1855       }
  1856     }
  1856     }
  1857     if (u->is_FastLock() && u->as_FastLock()->obj_node() == obj) {
  1857     if (u->is_FastLock() && u->as_FastLock()->obj_node()->eqv_uncast(obj)) {
  1858       FastLockNode* flock = u->as_FastLock();
  1858       FastLockNode* flock = u->as_FastLock();
  1859       assert(flock->box_node() == oldbox, "sanity");
  1859       assert(flock->box_node() == oldbox, "sanity");
  1860       _igvn.hash_delete(flock);
  1860       _igvn.hash_delete(flock);
  1861       flock->set_box_node(newbox);
  1861       flock->set_box_node(newbox);
  1862       _igvn._worklist.push(flock);
  1862       _igvn._worklist.push(flock);
  1873         int num_mon  = jvms->nof_monitors();
  1873         int num_mon  = jvms->nof_monitors();
  1874         // Loop over monitors
  1874         // Loop over monitors
  1875         for (int idx = 0; idx < num_mon; idx++) {
  1875         for (int idx = 0; idx < num_mon; idx++) {
  1876           Node* obj_node = sfn->monitor_obj(jvms, idx);
  1876           Node* obj_node = sfn->monitor_obj(jvms, idx);
  1877           Node* box_node = sfn->monitor_box(jvms, idx);
  1877           Node* box_node = sfn->monitor_box(jvms, idx);
  1878           if (box_node == oldbox && obj_node == obj) {
  1878           if (box_node == oldbox && obj_node->eqv_uncast(obj)) {
  1879             int j = jvms->monitor_box_offset(idx);
  1879             int j = jvms->monitor_box_offset(idx);
  1880             _igvn.hash_delete(u);
  1880             _igvn.hash_delete(u);
  1881             u->set_req(j, newbox);
  1881             u->set_req(j, newbox);
  1882             _igvn._worklist.push(u);
  1882             _igvn._worklist.push(u);
  1883             next_edge = false;
  1883             next_edge = false;
  1910           Node* u = box_node->raw_out(i);
  1910           Node* u = box_node->raw_out(i);
  1911           if (u->is_AbstractLock()) {
  1911           if (u->is_AbstractLock()) {
  1912             alock = u->as_AbstractLock();
  1912             alock = u->as_AbstractLock();
  1913             if (alock->box_node() == box_node) {
  1913             if (alock->box_node() == box_node) {
  1914               // Verify that this Box is referenced only by related locks.
  1914               // Verify that this Box is referenced only by related locks.
  1915               assert(alock->obj_node() == obj, "");
  1915               assert(alock->obj_node()->eqv_uncast(obj), "");
  1916               // Mark all related locks and unlocks.
  1916               // Mark all related locks and unlocks.
  1917               alock->set_nested();
  1917               alock->set_nested();
  1918             }
  1918             }
  1919           }
  1919           }
  1920         }
  1920         }
  1929     // Look for all locks of this object and mark them and
  1929     // Look for all locks of this object and mark them and
  1930     // corresponding BoxLock nodes as eliminated.
  1930     // corresponding BoxLock nodes as eliminated.
  1931     Node* obj = alock->obj_node();
  1931     Node* obj = alock->obj_node();
  1932     for (uint j = 0; j < obj->outcnt(); j++) {
  1932     for (uint j = 0; j < obj->outcnt(); j++) {
  1933       Node* o = obj->raw_out(j);
  1933       Node* o = obj->raw_out(j);
  1934       if (o->is_AbstractLock() && o->as_AbstractLock()->obj_node() == obj) {
  1934       if (o->is_AbstractLock() &&
       
  1935           o->as_AbstractLock()->obj_node()->eqv_uncast(obj)) {
  1935         alock = o->as_AbstractLock();
  1936         alock = o->as_AbstractLock();
  1936         Node* box = alock->box_node();
  1937         Node* box = alock->box_node();
  1937         // Replace old box node with new eliminated box for all users
  1938         // Replace old box node with new eliminated box for all users
  1938         // of the same object and mark related locks as eliminated.
  1939         // of the same object and mark related locks as eliminated.
  1939         mark_eliminated_box(box, obj);
  1940         mark_eliminated_box(box, obj);