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); |