< prev index next >

src/hotspot/share/opto/parse2.cpp

Print this page

1711 
1712 
1713 static Node* extract_obj_from_klass_load(PhaseGVN* gvn, Node* n) {
1714   Node* ldk;
1715   if (n->is_DecodeNKlass()) {
1716     if (n->in(1)->Opcode() != Op_LoadNKlass) {
1717       return nullptr;
1718     } else {
1719       ldk = n->in(1);
1720     }
1721   } else if (n->Opcode() != Op_LoadKlass) {
1722     return nullptr;
1723   } else {
1724     ldk = n;
1725   }
1726   assert(ldk != nullptr && ldk->is_Load(), "should have found a LoadKlass or LoadNKlass node");
1727 
1728   Node* adr = ldk->in(MemNode::Address);
1729   intptr_t off = 0;
1730   Node* obj = AddPNode::Ideal_base_and_offset(adr, gvn, off);
1731   if (obj == nullptr || off != oopDesc::klass_offset_in_bytes()) // loading oopDesc::_klass?
1732     return nullptr;
1733   const TypePtr* tp = gvn->type(obj)->is_ptr();
1734   if (tp == nullptr || !(tp->isa_instptr() || tp->isa_aryptr())) // is obj a Java object ptr?
1735     return nullptr;
1736 
1737   return obj;
1738 }
1739 
1740 void Parse::sharpen_type_after_if(BoolTest::mask btest,
1741                                   Node* con, const Type* tcon,
1742                                   Node* val, const Type* tval) {
1743   // Look for opportunities to sharpen the type of a node
1744   // whose klass is compared with a constant klass.
1745   if (btest == BoolTest::eq && tcon->isa_klassptr()) {
1746     Node* obj = extract_obj_from_klass_load(&_gvn, val);
1747     const TypeOopPtr* con_type = tcon->isa_klassptr()->as_instance_type();
1748     if (obj != nullptr && (con_type->isa_instptr() || con_type->isa_aryptr())) {
1749        // Found:
1750        //   Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq])
1751        // or the narrowOop equivalent.

1711 
1712 
1713 static Node* extract_obj_from_klass_load(PhaseGVN* gvn, Node* n) {
1714   Node* ldk;
1715   if (n->is_DecodeNKlass()) {
1716     if (n->in(1)->Opcode() != Op_LoadNKlass) {
1717       return nullptr;
1718     } else {
1719       ldk = n->in(1);
1720     }
1721   } else if (n->Opcode() != Op_LoadKlass) {
1722     return nullptr;
1723   } else {
1724     ldk = n;
1725   }
1726   assert(ldk != nullptr && ldk->is_Load(), "should have found a LoadKlass or LoadNKlass node");
1727 
1728   Node* adr = ldk->in(MemNode::Address);
1729   intptr_t off = 0;
1730   Node* obj = AddPNode::Ideal_base_and_offset(adr, gvn, off);
1731   if (obj == nullptr || off != Type::klass_offset()) // loading oopDesc::_klass?
1732     return nullptr;
1733   const TypePtr* tp = gvn->type(obj)->is_ptr();
1734   if (tp == nullptr || !(tp->isa_instptr() || tp->isa_aryptr())) // is obj a Java object ptr?
1735     return nullptr;
1736 
1737   return obj;
1738 }
1739 
1740 void Parse::sharpen_type_after_if(BoolTest::mask btest,
1741                                   Node* con, const Type* tcon,
1742                                   Node* val, const Type* tval) {
1743   // Look for opportunities to sharpen the type of a node
1744   // whose klass is compared with a constant klass.
1745   if (btest == BoolTest::eq && tcon->isa_klassptr()) {
1746     Node* obj = extract_obj_from_klass_load(&_gvn, val);
1747     const TypeOopPtr* con_type = tcon->isa_klassptr()->as_instance_type();
1748     if (obj != nullptr && (con_type->isa_instptr() || con_type->isa_aryptr())) {
1749        // Found:
1750        //   Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq])
1751        // or the narrowOop equivalent.
< prev index next >