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 |