hotspot/src/share/vm/opto/callGenerator.cpp
changeset 10509 43d670e5701e
parent 10503 04b74421bdea
child 10510 ab626d1bdf53
equal deleted inserted replaced
10508:233d2e7c462d 10509:43d670e5701e
    59   ParseGenerator(ciMethod* method, float expected_uses, bool is_osr = false)
    59   ParseGenerator(ciMethod* method, float expected_uses, bool is_osr = false)
    60     : InlineCallGenerator(method)
    60     : InlineCallGenerator(method)
    61   {
    61   {
    62     _is_osr        = is_osr;
    62     _is_osr        = is_osr;
    63     _expected_uses = expected_uses;
    63     _expected_uses = expected_uses;
    64     assert(can_parse(method, is_osr), "parse must be possible");
    64     assert(InlineTree::check_can_parse(method) == NULL, "parse must be possible");
    65   }
    65   }
    66 
       
    67   // Can we build either an OSR or a regular parser for this method?
       
    68   static bool can_parse(ciMethod* method, int is_osr = false);
       
    69 
    66 
    70   virtual bool      is_parse() const           { return true; }
    67   virtual bool      is_parse() const           { return true; }
    71   virtual JVMState* generate(JVMState* jvms);
    68   virtual JVMState* generate(JVMState* jvms);
    72   int is_osr() { return _is_osr; }
    69   int is_osr() { return _is_osr; }
    73 
    70 
   301   // his JVMS gets adjusted.
   298   // his JVMS gets adjusted.
   302   kit.cast_not_null(receiver);
   299   kit.cast_not_null(receiver);
   303   return kit.transfer_exceptions_into_jvms();
   300   return kit.transfer_exceptions_into_jvms();
   304 }
   301 }
   305 
   302 
   306 bool ParseGenerator::can_parse(ciMethod* m, int entry_bci) {
       
   307   // Certain methods cannot be parsed at all:
       
   308   if (!m->can_be_compiled())              return false;
       
   309   if (!m->has_balanced_monitors())        return false;
       
   310   if (m->get_flow_analysis()->failing())  return false;
       
   311 
       
   312   // (Methods may bail out for other reasons, after the parser is run.
       
   313   // We try to avoid this, but if forced, we must return (Node*)NULL.
       
   314   // The user of the CallGenerator must check for this condition.)
       
   315   return true;
       
   316 }
       
   317 
       
   318 CallGenerator* CallGenerator::for_inline(ciMethod* m, float expected_uses) {
   303 CallGenerator* CallGenerator::for_inline(ciMethod* m, float expected_uses) {
   319   if (!ParseGenerator::can_parse(m))  return NULL;
   304   if (InlineTree::check_can_parse(m) != NULL)  return NULL;
   320   return new ParseGenerator(m, expected_uses);
   305   return new ParseGenerator(m, expected_uses);
   321 }
   306 }
   322 
   307 
   323 // As a special case, the JVMS passed to this CallGenerator is
   308 // As a special case, the JVMS passed to this CallGenerator is
   324 // for the method execution already in progress, not just the JVMS
   309 // for the method execution already in progress, not just the JVMS
   325 // of the caller.  Thus, this CallGenerator cannot be mixed with others!
   310 // of the caller.  Thus, this CallGenerator cannot be mixed with others!
   326 CallGenerator* CallGenerator::for_osr(ciMethod* m, int osr_bci) {
   311 CallGenerator* CallGenerator::for_osr(ciMethod* m, int osr_bci) {
   327   if (!ParseGenerator::can_parse(m, true))  return NULL;
   312   if (InlineTree::check_can_parse(m) != NULL)  return NULL;
   328   float past_uses = m->interpreter_invocation_count();
   313   float past_uses = m->interpreter_invocation_count();
   329   float expected_uses = past_uses;
   314   float expected_uses = past_uses;
   330   return new ParseGenerator(m, expected_uses, true);
   315   return new ParseGenerator(m, expected_uses, true);
   331 }
   316 }
   332 
   317