src/share/vm/opto/parseHelper.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 7118863 Sdiff src/share/vm/opto

src/share/vm/opto/parseHelper.cpp

Print this page




 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() {


src/share/vm/opto/parseHelper.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File