JVMState* WarmCallGenerator::generate(JVMState* jvms) { Compile* C = Compile::current(); C->print_inlining_update(this); if (C->log() != NULL) { C->log()->elem("warm_call bci='%d'", jvms->bci()); } jvms = _if_cold->generate(jvms); if (jvms != NULL) { Node* m = jvms->map()->control(); if (m->is_CatchProj()) m = m->in(0); else m = C->top(); if (m->is_Catch()) m = m->in(0); else m = C->top(); if (m->is_Proj()) m = m->in(0); else m = C->top(); if (m->is_CallJava()) { _call_info->set_call(m->as_Call()); _call_info->set_hot_cg(_if_hot); #ifndef PRODUCT if (PrintOpto || PrintOptoInlining) { tty->print_cr("Queueing for warm inlining at bci %d:", jvms->bci()); tty->print("WCI: "); _call_info->print(); } #endif _call_info->set_heat(_call_info->compute_heat()); C->set_warm_calls(_call_info->insert_into(C->warm_calls())); } } return jvms; }
JVMState* ParseGenerator::generate(JVMState* jvms) { Compile* C = Compile::current(); C->print_inlining_update(this); if (is_osr()) { // The JVMS for a OSR has a single argument (see its TypeFunc). assert(jvms->depth() == 1, "no inline OSR"); } if (C->failing()) { return NULL; // bailing out of the compile; do not try to parse } Parse parser(jvms, method(), _expected_uses); // Grab signature for matching/allocation #ifdef ASSERT if (parser.tf() != (parser.depth() == 1 ? C->tf() : tf())) { MutexLockerEx ml(Compile_lock, Mutex::_no_safepoint_check_flag); assert(C->env()->system_dictionary_modification_counter_changed(), "Must invalidate if TypeFuncs differ"); } #endif GraphKit& exits = parser.exits(); if (C->failing()) { while (exits.pop_exception_state() != NULL) ; return NULL; } assert(exits.jvms()->same_calls_as(jvms), "sanity"); // Simply return the exit state of the parser, // augmented by any exceptional states. return exits.transfer_exceptions_into_jvms(); }