hotspot/src/share/vm/opto/compile.cpp
changeset 9176 42d9d1010f38
parent 9175 80221fe09772
child 9179 6db9c9dffe1f
equal deleted inserted replaced
9175:80221fe09772 9176:42d9d1010f38
   627 
   627 
   628     // Put top into the hash table ASAP.
   628     // Put top into the hash table ASAP.
   629     initial_gvn()->transform_no_reclaim(top());
   629     initial_gvn()->transform_no_reclaim(top());
   630 
   630 
   631     // Set up tf(), start(), and find a CallGenerator.
   631     // Set up tf(), start(), and find a CallGenerator.
   632     CallGenerator* cg;
   632     CallGenerator* cg = NULL;
   633     if (is_osr_compilation()) {
   633     if (is_osr_compilation()) {
   634       const TypeTuple *domain = StartOSRNode::osr_domain();
   634       const TypeTuple *domain = StartOSRNode::osr_domain();
   635       const TypeTuple *range = TypeTuple::make_range(method()->signature());
   635       const TypeTuple *range = TypeTuple::make_range(method()->signature());
   636       init_tf(TypeFunc::make(domain, range));
   636       init_tf(TypeFunc::make(domain, range));
   637       StartNode* s = new (this, 2) StartOSRNode(root(), domain);
   637       StartNode* s = new (this, 2) StartOSRNode(root(), domain);
   642       // Normal case.
   642       // Normal case.
   643       init_tf(TypeFunc::make(method()));
   643       init_tf(TypeFunc::make(method()));
   644       StartNode* s = new (this, 2) StartNode(root(), tf()->domain());
   644       StartNode* s = new (this, 2) StartNode(root(), tf()->domain());
   645       initial_gvn()->set_type_bottom(s);
   645       initial_gvn()->set_type_bottom(s);
   646       init_start(s);
   646       init_start(s);
   647       float past_uses = method()->interpreter_invocation_count();
   647       if (method()->intrinsic_id() == vmIntrinsics::_Reference_get && UseG1GC) {
   648       float expected_uses = past_uses;
   648         // With java.lang.ref.reference.get() we must go through the
   649       cg = CallGenerator::for_inline(method(), expected_uses);
   649         // intrinsic when G1 is enabled - even when get() is the root
       
   650         // method of the compile - so that, if necessary, the value in
       
   651         // the referent field of the reference object gets recorded by
       
   652         // the pre-barrier code.
       
   653         // Specifically, if G1 is enabled, the value in the referent
       
   654         // field is recorded by the G1 SATB pre barrier. This will
       
   655         // result in the referent being marked live and the reference
       
   656         // object removed from the list of discovered references during
       
   657         // reference processing.
       
   658         cg = find_intrinsic(method(), false);
       
   659       }
       
   660       if (cg == NULL) {
       
   661         float past_uses = method()->interpreter_invocation_count();
       
   662         float expected_uses = past_uses;
       
   663         cg = CallGenerator::for_inline(method(), expected_uses);
       
   664       }
   650     }
   665     }
   651     if (failing())  return;
   666     if (failing())  return;
   652     if (cg == NULL) {
   667     if (cg == NULL) {
   653       record_method_not_compilable_all_tiers("cannot parse method");
   668       record_method_not_compilable_all_tiers("cannot parse method");
   654       return;
   669       return;