804 #endif |
804 #endif |
805 _igvn.replace_node(mem_proj, mem); |
805 _igvn.replace_node(mem_proj, mem); |
806 } |
806 } |
807 } else if (use->is_AddP()) { |
807 } else if (use->is_AddP()) { |
808 // raw memory addresses used only by the initialization |
808 // raw memory addresses used only by the initialization |
809 _igvn.hash_delete(use); |
809 _igvn.replace_node(use, C->top()); |
810 _igvn.subsume_node(use, C->top()); |
|
811 } else { |
810 } else { |
812 assert(false, "only Initialize or AddP expected"); |
811 assert(false, "only Initialize or AddP expected"); |
813 } |
812 } |
814 j -= (oc1 - _resproj->outcnt()); |
813 j -= (oc1 - _resproj->outcnt()); |
815 } |
814 } |
1289 |
1288 |
1290 |
1289 |
1291 if (_fallthroughcatchproj != NULL) { |
1290 if (_fallthroughcatchproj != NULL) { |
1292 ctrl = _fallthroughcatchproj->clone(); |
1291 ctrl = _fallthroughcatchproj->clone(); |
1293 transform_later(ctrl); |
1292 transform_later(ctrl); |
1294 _igvn.hash_delete(_fallthroughcatchproj); |
1293 _igvn.replace_node(_fallthroughcatchproj, result_region); |
1295 _igvn.subsume_node(_fallthroughcatchproj, result_region); |
|
1296 } else { |
1294 } else { |
1297 ctrl = top(); |
1295 ctrl = top(); |
1298 } |
1296 } |
1299 Node *slow_result; |
1297 Node *slow_result; |
1300 if (_resproj == NULL) { |
1298 if (_resproj == NULL) { |
1301 // no uses of the allocation result |
1299 // no uses of the allocation result |
1302 slow_result = top(); |
1300 slow_result = top(); |
1303 } else { |
1301 } else { |
1304 slow_result = _resproj->clone(); |
1302 slow_result = _resproj->clone(); |
1305 transform_later(slow_result); |
1303 transform_later(slow_result); |
1306 _igvn.hash_delete(_resproj); |
1304 _igvn.replace_node(_resproj, result_phi_rawoop); |
1307 _igvn.subsume_node(_resproj, result_phi_rawoop); |
|
1308 } |
1305 } |
1309 |
1306 |
1310 // Plug slow-path into result merge point |
1307 // Plug slow-path into result merge point |
1311 result_region ->init_req( slow_result_path, ctrl ); |
1308 result_region ->init_req( slow_result_path, ctrl ); |
1312 result_phi_rawoop->init_req( slow_result_path, slow_result); |
1309 result_phi_rawoop->init_req( slow_result_path, slow_result); |
1611 // Seach for MemBarAcquire node and delete it also. |
1608 // Seach for MemBarAcquire node and delete it also. |
1612 MemBarNode* membar = fallthroughproj->unique_ctrl_out()->as_MemBar(); |
1609 MemBarNode* membar = fallthroughproj->unique_ctrl_out()->as_MemBar(); |
1613 assert(membar != NULL && membar->Opcode() == Op_MemBarAcquire, ""); |
1610 assert(membar != NULL && membar->Opcode() == Op_MemBarAcquire, ""); |
1614 Node* ctrlproj = membar->proj_out(TypeFunc::Control); |
1611 Node* ctrlproj = membar->proj_out(TypeFunc::Control); |
1615 Node* memproj = membar->proj_out(TypeFunc::Memory); |
1612 Node* memproj = membar->proj_out(TypeFunc::Memory); |
1616 _igvn.hash_delete(ctrlproj); |
1613 _igvn.replace_node(ctrlproj, fallthroughproj); |
1617 _igvn.subsume_node(ctrlproj, fallthroughproj); |
1614 _igvn.replace_node(memproj, memproj_fallthrough); |
1618 _igvn.hash_delete(memproj); |
|
1619 _igvn.subsume_node(memproj, memproj_fallthrough); |
|
1620 |
1615 |
1621 // Delete FastLock node also if this Lock node is unique user |
1616 // Delete FastLock node also if this Lock node is unique user |
1622 // (a loop peeling may clone a Lock node). |
1617 // (a loop peeling may clone a Lock node). |
1623 Node* flock = alock->as_Lock()->fastlock_node(); |
1618 Node* flock = alock->as_Lock()->fastlock_node(); |
1624 if (flock->outcnt() == 1) { |
1619 if (flock->outcnt() == 1) { |
1625 assert(flock->unique_out() == alock, "sanity"); |
1620 assert(flock->unique_out() == alock, "sanity"); |
1626 _igvn.hash_delete(flock); |
1621 _igvn.replace_node(flock, top()); |
1627 _igvn.subsume_node(flock, top()); |
|
1628 } |
1622 } |
1629 } |
1623 } |
1630 |
1624 |
1631 // Seach for MemBarRelease node and delete it also. |
1625 // Seach for MemBarRelease node and delete it also. |
1632 if (alock->is_Unlock() && ctrl != NULL && ctrl->is_Proj() && |
1626 if (alock->is_Unlock() && ctrl != NULL && ctrl->is_Proj() && |
1633 ctrl->in(0)->is_MemBar()) { |
1627 ctrl->in(0)->is_MemBar()) { |
1634 MemBarNode* membar = ctrl->in(0)->as_MemBar(); |
1628 MemBarNode* membar = ctrl->in(0)->as_MemBar(); |
1635 assert(membar->Opcode() == Op_MemBarRelease && |
1629 assert(membar->Opcode() == Op_MemBarRelease && |
1636 mem->is_Proj() && membar == mem->in(0), ""); |
1630 mem->is_Proj() && membar == mem->in(0), ""); |
1637 _igvn.hash_delete(fallthroughproj); |
1631 _igvn.replace_node(fallthroughproj, ctrl); |
1638 _igvn.subsume_node(fallthroughproj, ctrl); |
1632 _igvn.replace_node(memproj_fallthrough, mem); |
1639 _igvn.hash_delete(memproj_fallthrough); |
|
1640 _igvn.subsume_node(memproj_fallthrough, mem); |
|
1641 fallthroughproj = ctrl; |
1633 fallthroughproj = ctrl; |
1642 memproj_fallthrough = mem; |
1634 memproj_fallthrough = mem; |
1643 ctrl = membar->in(TypeFunc::Control); |
1635 ctrl = membar->in(TypeFunc::Control); |
1644 mem = membar->in(TypeFunc::Memory); |
1636 mem = membar->in(TypeFunc::Memory); |
1645 } |
1637 } |
1646 |
1638 |
1647 _igvn.hash_delete(fallthroughproj); |
1639 _igvn.replace_node(fallthroughproj, ctrl); |
1648 _igvn.subsume_node(fallthroughproj, ctrl); |
1640 _igvn.replace_node(memproj_fallthrough, mem); |
1649 _igvn.hash_delete(memproj_fallthrough); |
|
1650 _igvn.subsume_node(memproj_fallthrough, mem); |
|
1651 return true; |
1641 return true; |
1652 } |
1642 } |
1653 |
1643 |
1654 |
1644 |
1655 //------------------------------expand_lock_node---------------------- |
1645 //------------------------------expand_lock_node---------------------- |
1877 _igvn.hash_delete(_fallthroughproj); |
1867 _igvn.hash_delete(_fallthroughproj); |
1878 _fallthroughproj->disconnect_inputs(NULL); |
1868 _fallthroughproj->disconnect_inputs(NULL); |
1879 region->init_req(1, slow_ctrl); |
1869 region->init_req(1, slow_ctrl); |
1880 // region inputs are now complete |
1870 // region inputs are now complete |
1881 transform_later(region); |
1871 transform_later(region); |
1882 _igvn.subsume_node(_fallthroughproj, region); |
1872 _igvn.replace_node(_fallthroughproj, region); |
1883 |
1873 |
1884 Node *memproj = transform_later( new(C, 1) ProjNode(call, TypeFunc::Memory) ); |
1874 Node *memproj = transform_later( new(C, 1) ProjNode(call, TypeFunc::Memory) ); |
1885 mem_phi->init_req(1, memproj ); |
1875 mem_phi->init_req(1, memproj ); |
1886 transform_later(mem_phi); |
1876 transform_later(mem_phi); |
1887 _igvn.hash_delete(_memproj_fallthrough); |
1877 _igvn.replace_node(_memproj_fallthrough, mem_phi); |
1888 _igvn.subsume_node(_memproj_fallthrough, mem_phi); |
|
1889 } |
1878 } |
1890 |
1879 |
1891 //------------------------------expand_unlock_node---------------------- |
1880 //------------------------------expand_unlock_node---------------------- |
1892 void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) { |
1881 void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) { |
1893 |
1882 |
1941 _igvn.hash_delete(_fallthroughproj); |
1930 _igvn.hash_delete(_fallthroughproj); |
1942 _fallthroughproj->disconnect_inputs(NULL); |
1931 _fallthroughproj->disconnect_inputs(NULL); |
1943 region->init_req(1, slow_ctrl); |
1932 region->init_req(1, slow_ctrl); |
1944 // region inputs are now complete |
1933 // region inputs are now complete |
1945 transform_later(region); |
1934 transform_later(region); |
1946 _igvn.subsume_node(_fallthroughproj, region); |
1935 _igvn.replace_node(_fallthroughproj, region); |
1947 |
1936 |
1948 Node *memproj = transform_later( new(C, 1) ProjNode(call, TypeFunc::Memory) ); |
1937 Node *memproj = transform_later( new(C, 1) ProjNode(call, TypeFunc::Memory) ); |
1949 mem_phi->init_req(1, memproj ); |
1938 mem_phi->init_req(1, memproj ); |
1950 mem_phi->init_req(2, mem); |
1939 mem_phi->init_req(2, mem); |
1951 transform_later(mem_phi); |
1940 transform_later(mem_phi); |
1952 _igvn.hash_delete(_memproj_fallthrough); |
1941 _igvn.replace_node(_memproj_fallthrough, mem_phi); |
1953 _igvn.subsume_node(_memproj_fallthrough, mem_phi); |
|
1954 } |
1942 } |
1955 |
1943 |
1956 //------------------------------expand_macro_nodes---------------------- |
1944 //------------------------------expand_macro_nodes---------------------- |
1957 // Returns true if a failure occurred. |
1945 // Returns true if a failure occurred. |
1958 bool PhaseMacroExpand::expand_macro_nodes() { |
1946 bool PhaseMacroExpand::expand_macro_nodes() { |
1967 bool success = false; |
1955 bool success = false; |
1968 debug_only(int old_macro_count = C->macro_count();); |
1956 debug_only(int old_macro_count = C->macro_count();); |
1969 if (n->is_AbstractLock()) { |
1957 if (n->is_AbstractLock()) { |
1970 success = eliminate_locking_node(n->as_AbstractLock()); |
1958 success = eliminate_locking_node(n->as_AbstractLock()); |
1971 } else if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { |
1959 } else if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { |
1972 _igvn.add_users_to_worklist(n); |
1960 _igvn.replace_node(n, n->in(1)); |
1973 _igvn.hash_delete(n); |
|
1974 _igvn.subsume_node(n, n->in(1)); |
|
1975 success = true; |
1961 success = true; |
1976 } |
1962 } |
1977 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
1963 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
1978 progress = progress || success; |
1964 progress = progress || success; |
1979 } |
1965 } |