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