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 { |