hotspot/src/share/vm/opto/escape.cpp
changeset 360 21d113ecbf6a
parent 349 94856a2bae83
child 371 1aacedc9db7c
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
  1747     {
  1747     {
  1748       // assume that all exception objects globally escape
  1748       // assume that all exception objects globally escape
  1749       add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
  1749       add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
  1750       break;
  1750       break;
  1751     }
  1751     }
       
  1752     case Op_ConN:
       
  1753     {
       
  1754       // assume all narrow oop constants globally escape except for null
       
  1755       PointsToNode::EscapeState es;
       
  1756       if (phase->type(n) == TypeNarrowOop::NULL_PTR)
       
  1757         es = PointsToNode::NoEscape;
       
  1758       else
       
  1759         es = PointsToNode::GlobalEscape;
       
  1760 
       
  1761       add_node(n, PointsToNode::JavaObject, es, true);
       
  1762       break;
       
  1763     }
  1752     case Op_LoadKlass:
  1764     case Op_LoadKlass:
  1753     {
  1765     {
  1754       add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
  1766       add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
  1755       break;
  1767       break;
  1756     }
  1768     }
  1757     case Op_LoadP:
  1769     case Op_LoadP:
       
  1770     case Op_LoadN:
  1758     {
  1771     {
  1759       const Type *t = phase->type(n);
  1772       const Type *t = phase->type(n);
  1760       if (t->isa_ptr() == NULL) {
  1773       if (!t->isa_narrowoop() && t->isa_ptr() == NULL) {
  1761         _processed.set(n->_idx);
  1774         _processed.set(n->_idx);
  1762         return;
  1775         return;
  1763       }
  1776       }
  1764       add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
  1777       add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
  1765       break;
  1778       break;
  1845       }
  1858       }
  1846       _processed.set(n->_idx);
  1859       _processed.set(n->_idx);
  1847       break;
  1860       break;
  1848     }
  1861     }
  1849     case Op_StoreP:
  1862     case Op_StoreP:
       
  1863     case Op_StoreN:
  1850     {
  1864     {
  1851       const Type *adr_type = phase->type(n->in(MemNode::Address));
  1865       const Type *adr_type = phase->type(n->in(MemNode::Address));
       
  1866       if (adr_type->isa_narrowoop()) {
       
  1867         adr_type = adr_type->is_narrowoop()->make_oopptr();
       
  1868       }
  1852       if (adr_type->isa_oopptr()) {
  1869       if (adr_type->isa_oopptr()) {
  1853         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
  1870         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
  1854       } else {
  1871       } else {
  1855         Node* adr = n->in(MemNode::Address);
  1872         Node* adr = n->in(MemNode::Address);
  1856         if (adr->is_AddP() && phase->type(adr) == TypeRawPtr::NOTNULL &&
  1873         if (adr->is_AddP() && phase->type(adr) == TypeRawPtr::NOTNULL &&
  1868       }
  1885       }
  1869       break;
  1886       break;
  1870     }
  1887     }
  1871     case Op_StorePConditional:
  1888     case Op_StorePConditional:
  1872     case Op_CompareAndSwapP:
  1889     case Op_CompareAndSwapP:
       
  1890     case Op_CompareAndSwapN:
  1873     {
  1891     {
  1874       const Type *adr_type = phase->type(n->in(MemNode::Address));
  1892       const Type *adr_type = phase->type(n->in(MemNode::Address));
       
  1893       if (adr_type->isa_narrowoop()) {
       
  1894         adr_type = adr_type->is_narrowoop()->make_oopptr();
       
  1895       }
  1875       if (adr_type->isa_oopptr()) {
  1896       if (adr_type->isa_oopptr()) {
  1876         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
  1897         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
  1877       } else {
  1898       } else {
  1878         _processed.set(n->_idx);
  1899         _processed.set(n->_idx);
  1879         return;
  1900         return;
  1925       assert(false, "Op_CastX2P");
  1946       assert(false, "Op_CastX2P");
  1926       break;
  1947       break;
  1927     }
  1948     }
  1928     case Op_CastPP:
  1949     case Op_CastPP:
  1929     case Op_CheckCastPP:
  1950     case Op_CheckCastPP:
       
  1951     case Op_EncodeP:
       
  1952     case Op_DecodeN:
  1930     {
  1953     {
  1931       int ti = n->in(1)->_idx;
  1954       int ti = n->in(1)->_idx;
  1932       if (_nodes->adr_at(ti)->node_type() == PointsToNode::JavaObject) {
  1955       if (_nodes->adr_at(ti)->node_type() == PointsToNode::JavaObject) {
  1933         add_pointsto_edge(n->_idx, ti);
  1956         add_pointsto_edge(n->_idx, ti);
  1934       } else {
  1957       } else {