183 Deoptimization::Action_maybe_recompile, 184 tak->klass()); 185 } 186 if (stopped()) { // MUST uncommon-trap? 187 set_control(ctrl); // Then Don't Do It, just fall into the normal checking 188 } else { // Cast array klass to exactness: 189 // Use the exact constant value we know it is. 190 replace_in_map(array_klass,con); 191 CompileLog* log = C->log(); 192 if (log != NULL) { 193 log->elem("cast_up reason='monomorphic_array' from='%d' to='(exact)'", 194 log->identify(tak->klass())); 195 } 196 array_klass = con; // Use cast value moving forward 197 } 198 } 199 200 // Come here for polymorphic array klasses 201 202 // Extract the array element class 203 int element_klass_offset = objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc); 204 Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset); 205 Node *a_e_klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p2, tak) ); 206 207 // Check (the hard way) and throw if not a subklass. 208 // Result is ignored, we just need the CFG effects. 209 gen_checkcast( obj, a_e_klass ); 210 } 211 212 213 void Parse::emit_guard_for_new(ciInstanceKlass* klass) { 214 // Emit guarded new 215 // if (klass->_init_thread != current_thread || 216 // klass->_init_state != being_initialized) 217 // uncommon_trap 218 Node* cur_thread = _gvn.transform( new (C, 1) ThreadLocalNode() ); 219 Node* merge = new (C, 3) RegionNode(3); 220 _gvn.set_type(merge, Type::CONTROL); 221 Node* kls = makecon(TypeKlassPtr::make(klass)); 222 223 Node* init_thread_offset = _gvn.MakeConX(instanceKlass::init_thread_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()); 224 Node* adr_node = basic_plus_adr(kls, kls, init_thread_offset); 225 Node* init_thread = make_load(NULL, adr_node, TypeRawPtr::BOTTOM, T_ADDRESS); 226 Node *tst = Bool( CmpP( init_thread, cur_thread), BoolTest::eq); 227 IfNode* iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN); 228 set_control(IfTrue(iff)); 229 merge->set_req(1, IfFalse(iff)); 230 231 Node* init_state_offset = _gvn.MakeConX(instanceKlass::init_state_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()); 232 adr_node = basic_plus_adr(kls, kls, init_state_offset); 233 Node* init_state = make_load(NULL, adr_node, TypeInt::INT, T_INT); 234 Node* being_init = _gvn.intcon(instanceKlass::being_initialized); 235 tst = Bool( CmpI( init_state, being_init), BoolTest::eq); 236 iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN); 237 set_control(IfTrue(iff)); 238 merge->set_req(2, IfFalse(iff)); 239 240 PreserveJVMState pjvms(this); 241 record_for_igvn(merge); 242 set_control(merge); 243 244 uncommon_trap(Deoptimization::Reason_uninitialized, 245 Deoptimization::Action_reinterpret, 246 klass); 247 } 248 249 250 //------------------------------do_new----------------------------------------- 251 void Parse::do_new() { | 183 Deoptimization::Action_maybe_recompile, 184 tak->klass()); 185 } 186 if (stopped()) { // MUST uncommon-trap? 187 set_control(ctrl); // Then Don't Do It, just fall into the normal checking 188 } else { // Cast array klass to exactness: 189 // Use the exact constant value we know it is. 190 replace_in_map(array_klass,con); 191 CompileLog* log = C->log(); 192 if (log != NULL) { 193 log->elem("cast_up reason='monomorphic_array' from='%d' to='(exact)'", 194 log->identify(tak->klass())); 195 } 196 array_klass = con; // Use cast value moving forward 197 } 198 } 199 200 // Come here for polymorphic array klasses 201 202 // Extract the array element class 203 int element_klass_offset = in_bytes(objArrayKlass::element_klass_offset()); 204 Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset); 205 Node *a_e_klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p2, tak) ); 206 207 // Check (the hard way) and throw if not a subklass. 208 // Result is ignored, we just need the CFG effects. 209 gen_checkcast( obj, a_e_klass ); 210 } 211 212 213 void Parse::emit_guard_for_new(ciInstanceKlass* klass) { 214 // Emit guarded new 215 // if (klass->_init_thread != current_thread || 216 // klass->_init_state != being_initialized) 217 // uncommon_trap 218 Node* cur_thread = _gvn.transform( new (C, 1) ThreadLocalNode() ); 219 Node* merge = new (C, 3) RegionNode(3); 220 _gvn.set_type(merge, Type::CONTROL); 221 Node* kls = makecon(TypeKlassPtr::make(klass)); 222 223 Node* init_thread_offset = _gvn.MakeConX(in_bytes(instanceKlass::init_thread_offset())); 224 Node* adr_node = basic_plus_adr(kls, kls, init_thread_offset); 225 Node* init_thread = make_load(NULL, adr_node, TypeRawPtr::BOTTOM, T_ADDRESS); 226 Node *tst = Bool( CmpP( init_thread, cur_thread), BoolTest::eq); 227 IfNode* iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN); 228 set_control(IfTrue(iff)); 229 merge->set_req(1, IfFalse(iff)); 230 231 Node* init_state_offset = _gvn.MakeConX(in_bytes(instanceKlass::init_state_offset())); 232 adr_node = basic_plus_adr(kls, kls, init_state_offset); 233 Node* init_state = make_load(NULL, adr_node, TypeInt::INT, T_INT); 234 Node* being_init = _gvn.intcon(instanceKlass::being_initialized); 235 tst = Bool( CmpI( init_state, being_init), BoolTest::eq); 236 iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN); 237 set_control(IfTrue(iff)); 238 merge->set_req(2, IfFalse(iff)); 239 240 PreserveJVMState pjvms(this); 241 record_for_igvn(merge); 242 set_control(merge); 243 244 uncommon_trap(Deoptimization::Reason_uninitialized, 245 Deoptimization::Action_reinterpret, 246 klass); 247 } 248 249 250 //------------------------------do_new----------------------------------------- 251 void Parse::do_new() { |