hotspot/src/share/vm/opto/macro.cpp
changeset 2532 da0b1680593b
parent 2154 72a9b7284ccf
child 2867 69187054225f
equal deleted inserted replaced
2531:c974c3e10bf7 2532:da0b1680593b
   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     }