src/hotspot/share/opto/parseHelper.cpp
changeset 55110 17f85a8780d5
parent 53002 9d60798b21af
equal deleted inserted replaced
55109:31f43d8e7afb 55110:17f85a8780d5
   233   // Result is ignored, we just need the CFG effects.
   233   // Result is ignored, we just need the CFG effects.
   234   gen_checkcast(obj, a_e_klass);
   234   gen_checkcast(obj, a_e_klass);
   235 }
   235 }
   236 
   236 
   237 
   237 
   238 void Parse::emit_guard_for_new(ciInstanceKlass* klass) {
       
   239   // Emit guarded new
       
   240   //   if (klass->_init_thread != current_thread ||
       
   241   //       klass->_init_state != being_initialized)
       
   242   //      uncommon_trap
       
   243   Node* cur_thread = _gvn.transform( new ThreadLocalNode() );
       
   244   Node* merge = new RegionNode(3);
       
   245   _gvn.set_type(merge, Type::CONTROL);
       
   246   Node* kls = makecon(TypeKlassPtr::make(klass));
       
   247 
       
   248   Node* init_thread_offset = _gvn.MakeConX(in_bytes(InstanceKlass::init_thread_offset()));
       
   249   Node* adr_node = basic_plus_adr(kls, kls, init_thread_offset);
       
   250   Node* init_thread = make_load(NULL, adr_node, TypeRawPtr::BOTTOM, T_ADDRESS, MemNode::unordered);
       
   251   Node *tst   = Bool( CmpP( init_thread, cur_thread), BoolTest::eq);
       
   252   IfNode* iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN);
       
   253   set_control(IfTrue(iff));
       
   254   merge->set_req(1, IfFalse(iff));
       
   255 
       
   256   Node* init_state_offset = _gvn.MakeConX(in_bytes(InstanceKlass::init_state_offset()));
       
   257   adr_node = basic_plus_adr(kls, kls, init_state_offset);
       
   258   // Use T_BOOLEAN for InstanceKlass::_init_state so the compiler
       
   259   // can generate code to load it as unsigned byte.
       
   260   Node* init_state = make_load(NULL, adr_node, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered);
       
   261   Node* being_init = _gvn.intcon(InstanceKlass::being_initialized);
       
   262   tst   = Bool( CmpI( init_state, being_init), BoolTest::eq);
       
   263   iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN);
       
   264   set_control(IfTrue(iff));
       
   265   merge->set_req(2, IfFalse(iff));
       
   266 
       
   267   PreserveJVMState pjvms(this);
       
   268   record_for_igvn(merge);
       
   269   set_control(merge);
       
   270 
       
   271   uncommon_trap(Deoptimization::Reason_uninitialized,
       
   272                 Deoptimization::Action_reinterpret,
       
   273                 klass);
       
   274 }
       
   275 
       
   276 
       
   277 //------------------------------do_new-----------------------------------------
   238 //------------------------------do_new-----------------------------------------
   278 void Parse::do_new() {
   239 void Parse::do_new() {
   279   kill_dead_locals();
   240   kill_dead_locals();
   280 
   241 
   281   bool will_link;
   242   bool will_link;
   282   ciInstanceKlass* klass = iter().get_klass(will_link)->as_instance_klass();
   243   ciInstanceKlass* klass = iter().get_klass(will_link)->as_instance_klass();
   283   assert(will_link, "_new: typeflow responsibility");
   244   assert(will_link, "_new: typeflow responsibility");
   284 
   245 
   285   // Should initialize, or throw an InstantiationError?
   246   // Should throw an InstantiationError?
   286   if ((!klass->is_initialized() && !klass->is_being_initialized()) ||
   247   if (klass->is_abstract() || klass->is_interface() ||
   287       klass->is_abstract() || klass->is_interface() ||
       
   288       klass->name() == ciSymbol::java_lang_Class() ||
   248       klass->name() == ciSymbol::java_lang_Class() ||
   289       iter().is_unresolved_klass()) {
   249       iter().is_unresolved_klass()) {
   290     uncommon_trap(Deoptimization::Reason_uninitialized,
   250     uncommon_trap(Deoptimization::Reason_unhandled,
   291                   Deoptimization::Action_reinterpret,
   251                   Deoptimization::Action_none,
   292                   klass);
   252                   klass);
   293     return;
   253     return;
   294   }
   254   }
   295   if (klass->is_being_initialized()) {
   255 
   296     emit_guard_for_new(klass);
   256   if (C->needs_clinit_barrier(klass, method())) {
       
   257     clinit_barrier(klass, method());
       
   258     if (stopped())  return;
   297   }
   259   }
   298 
   260 
   299   Node* kls = makecon(TypeKlassPtr::make(klass));
   261   Node* kls = makecon(TypeKlassPtr::make(klass));
   300   Node* obj = new_instance(kls);
   262   Node* obj = new_instance(kls);
   301 
   263