< prev index next >

src/hotspot/share/opto/parse1.cpp

Print this page

2102 // class need finalization.
2103 void Parse::call_register_finalizer() {
2104   Node* receiver = local(0);
2105   assert(receiver != nullptr && receiver->bottom_type()->isa_instptr() != nullptr,
2106          "must have non-null instance type");
2107 
2108   const TypeInstPtr *tinst = receiver->bottom_type()->isa_instptr();
2109   if (tinst != nullptr && tinst->is_loaded() && !tinst->klass_is_exact()) {
2110     // The type isn't known exactly so see if CHA tells us anything.
2111     ciInstanceKlass* ik = tinst->instance_klass();
2112     if (!Dependencies::has_finalizable_subclass(ik)) {
2113       // No finalizable subclasses so skip the dynamic check.
2114       C->dependencies()->assert_has_no_finalizable_subclasses(ik);
2115       return;
2116     }
2117   }
2118 
2119   // Insert a dynamic test for whether the instance needs
2120   // finalization.  In general this will fold up since the concrete
2121   // class is often visible so the access flags are constant.
2122   Node* klass_addr = basic_plus_adr( receiver, receiver, oopDesc::klass_offset_in_bytes() );
2123   Node* klass = _gvn.transform(LoadKlassNode::make(_gvn, nullptr, immutable_memory(), klass_addr, TypeInstPtr::KLASS));
2124 
2125   Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::misc_flags_offset()));
2126   Node* access_flags = make_load(nullptr, access_flags_addr, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered);
2127 
2128   Node* mask  = _gvn.transform(new AndINode(access_flags, intcon(KlassFlags::_misc_has_finalizer)));
2129   Node* check = _gvn.transform(new CmpINode(mask, intcon(0)));
2130   Node* test  = _gvn.transform(new BoolNode(check, BoolTest::ne));
2131 
2132   IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN);
2133 
2134   RegionNode* result_rgn = new RegionNode(3);
2135   record_for_igvn(result_rgn);
2136 
2137   Node *skip_register = _gvn.transform(new IfFalseNode(iff));
2138   result_rgn->init_req(1, skip_register);
2139 
2140   Node *needs_register = _gvn.transform(new IfTrueNode(iff));
2141   set_control(needs_register);
2142   if (stopped()) {

2102 // class need finalization.
2103 void Parse::call_register_finalizer() {
2104   Node* receiver = local(0);
2105   assert(receiver != nullptr && receiver->bottom_type()->isa_instptr() != nullptr,
2106          "must have non-null instance type");
2107 
2108   const TypeInstPtr *tinst = receiver->bottom_type()->isa_instptr();
2109   if (tinst != nullptr && tinst->is_loaded() && !tinst->klass_is_exact()) {
2110     // The type isn't known exactly so see if CHA tells us anything.
2111     ciInstanceKlass* ik = tinst->instance_klass();
2112     if (!Dependencies::has_finalizable_subclass(ik)) {
2113       // No finalizable subclasses so skip the dynamic check.
2114       C->dependencies()->assert_has_no_finalizable_subclasses(ik);
2115       return;
2116     }
2117   }
2118 
2119   // Insert a dynamic test for whether the instance needs
2120   // finalization.  In general this will fold up since the concrete
2121   // class is often visible so the access flags are constant.
2122   Node* klass_addr = basic_plus_adr( receiver, receiver, Type::klass_offset() );
2123   Node* klass = _gvn.transform(LoadKlassNode::make(_gvn, nullptr, immutable_memory(), klass_addr, TypeInstPtr::KLASS));
2124 
2125   Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::misc_flags_offset()));
2126   Node* access_flags = make_load(nullptr, access_flags_addr, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered);
2127 
2128   Node* mask  = _gvn.transform(new AndINode(access_flags, intcon(KlassFlags::_misc_has_finalizer)));
2129   Node* check = _gvn.transform(new CmpINode(mask, intcon(0)));
2130   Node* test  = _gvn.transform(new BoolNode(check, BoolTest::ne));
2131 
2132   IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN);
2133 
2134   RegionNode* result_rgn = new RegionNode(3);
2135   record_for_igvn(result_rgn);
2136 
2137   Node *skip_register = _gvn.transform(new IfFalseNode(iff));
2138   result_rgn->init_req(1, skip_register);
2139 
2140   Node *needs_register = _gvn.transform(new IfTrueNode(iff));
2141   set_control(needs_register);
2142   if (stopped()) {
< prev index next >