Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/macro.cpp @ 4778:35acf8f0a2e4
7128352: assert(obj_node == obj) failed
Summary: Compare uncasted object nodes.
Reviewed-by: never
author | kvn |
---|---|
date | Tue, 10 Jan 2012 18:05:38 -0800 |
parents | e9a5e0a812c8 |
children | b0ff910edfc9 |
comparison
equal
deleted
inserted
replaced
4777:e9a5e0a812c8 | 4778:35acf8f0a2e4 |
---|---|
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); |