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