< prev index next >

src/hotspot/share/opto/parseHelper.cpp

Print this page




 218     }
 219   }
 220 
 221   // Come here for polymorphic array klasses
 222 
 223   // Extract the array element class
 224   int element_klass_offset = in_bytes(ObjArrayKlass::element_klass_offset());
 225   Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset);
 226   // We are allowed to use the constant type only if cast succeeded. If always_see_exact_class is true,
 227   // we must set a control edge from the IfTrue node created by the uncommon_trap above to the
 228   // LoadKlassNode.
 229   Node* a_e_klass = _gvn.transform(LoadKlassNode::make(_gvn, always_see_exact_class ? control() : NULL,
 230                                                        immutable_memory(), p2, tak));
 231 
 232   // Check (the hard way) and throw if not a subklass.
 233   // Result is ignored, we just need the CFG effects.
 234   gen_checkcast(obj, a_e_klass);
 235 }
 236 
 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-----------------------------------------
 278 void Parse::do_new() {
 279   kill_dead_locals();
 280 
 281   bool will_link;
 282   ciInstanceKlass* klass = iter().get_klass(will_link)->as_instance_klass();
 283   assert(will_link, "_new: typeflow responsibility");
 284 
 285   // Should initialize, or throw an InstantiationError?
 286   if ((!klass->is_initialized() && !klass->is_being_initialized()) ||
 287       klass->is_abstract() || klass->is_interface() ||
 288       klass->name() == ciSymbol::java_lang_Class() ||
 289       iter().is_unresolved_klass()) {
 290     uncommon_trap(Deoptimization::Reason_uninitialized,
 291                   Deoptimization::Action_reinterpret,
 292                   klass);
 293     return;
 294   }
 295   if (klass->is_being_initialized()) {
 296     emit_guard_for_new(klass);


 297   }
 298 
 299   Node* kls = makecon(TypeKlassPtr::make(klass));
 300   Node* obj = new_instance(kls);
 301 
 302   // Push resultant oop onto stack
 303   push(obj);
 304 
 305   // Keep track of whether opportunities exist for StringBuilder
 306   // optimizations.
 307   if (OptimizeStringConcat &&
 308       (klass == C->env()->StringBuilder_klass() ||
 309        klass == C->env()->StringBuffer_klass())) {
 310     C->set_has_stringbuilder(true);
 311   }
 312 
 313   // Keep track of boxed values for EliminateAutoBox optimizations.
 314   if (C->eliminate_boxing() && klass->is_box_klass()) {
 315     C->set_has_boxed_value(true);
 316   }




 218     }
 219   }
 220 
 221   // Come here for polymorphic array klasses
 222 
 223   // Extract the array element class
 224   int element_klass_offset = in_bytes(ObjArrayKlass::element_klass_offset());
 225   Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset);
 226   // We are allowed to use the constant type only if cast succeeded. If always_see_exact_class is true,
 227   // we must set a control edge from the IfTrue node created by the uncommon_trap above to the
 228   // LoadKlassNode.
 229   Node* a_e_klass = _gvn.transform(LoadKlassNode::make(_gvn, always_see_exact_class ? control() : NULL,
 230                                                        immutable_memory(), p2, tak));
 231 
 232   // Check (the hard way) and throw if not a subklass.
 233   // Result is ignored, we just need the CFG effects.
 234   gen_checkcast(obj, a_e_klass);
 235 }
 236 
 237 







































 238 //------------------------------do_new-----------------------------------------
 239 void Parse::do_new() {
 240   kill_dead_locals();
 241 
 242   bool will_link;
 243   ciInstanceKlass* klass = iter().get_klass(will_link)->as_instance_klass();
 244   assert(will_link, "_new: typeflow responsibility");
 245 
 246   // Should throw an InstantiationError?
 247   if (klass->is_abstract() || klass->is_interface() ||

 248       klass->name() == ciSymbol::java_lang_Class() ||
 249       iter().is_unresolved_klass()) {
 250     uncommon_trap(Deoptimization::Reason_unhandled,
 251                   Deoptimization::Action_none,
 252                   klass);
 253     return;
 254   }
 255 
 256   if (C->needs_clinit_barrier(klass, method())) {
 257     clinit_barrier(klass, method());
 258     if (stopped())  return;
 259   }
 260 
 261   Node* kls = makecon(TypeKlassPtr::make(klass));
 262   Node* obj = new_instance(kls);
 263 
 264   // Push resultant oop onto stack
 265   push(obj);
 266 
 267   // Keep track of whether opportunities exist for StringBuilder
 268   // optimizations.
 269   if (OptimizeStringConcat &&
 270       (klass == C->env()->StringBuilder_klass() ||
 271        klass == C->env()->StringBuffer_klass())) {
 272     C->set_has_stringbuilder(true);
 273   }
 274 
 275   // Keep track of boxed values for EliminateAutoBox optimizations.
 276   if (C->eliminate_boxing() && klass->is_box_klass()) {
 277     C->set_has_boxed_value(true);
 278   }


< prev index next >