hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
// Check if the method can be compiled, change level if necessary
void SimpleThresholdPolicy::compile(methodHandle mh, int bci, CompLevel level, TRAPS) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
// Take the given ceiling into the account.
// NOTE: You can set it to 1 to get a pure C1 version.
if ((CompLevel)TieredStopAtLevel < level) {
level = (CompLevel)TieredStopAtLevel;
}
{- -------------------------------------------
(1) もし要求されたコンパイルレベルが CompLevel_none (= インタープリタ実行) の場合は,
(インタープリタ実行で十分ということで, JIT コンパイルは必要ないので)
ここでリターン.
---------------------------------------- -}
if (level == CompLevel_none) {
return;
}
{- -------------------------------------------
(1) もし要求されたコンパイルレベルが CompLevel_full_optimization (= C2) なのに
C2 ではコンパイルできず, ただし CompLevel_simple (= C1) でならコンパイルできる場合,
コンパイルレベルを C1 にしてやり直す.
(具体的には, 引数を CompLevel_simple にして自分自身を再帰呼び出しし, その処理が終わったらリターン)
---------------------------------------- -}
// Check if the method can be compiled. If it cannot be compiled with C1, continue profiling
// in the interpreter and then compile with C2 (the transition function will request that,
// see common() ). If the method cannot be compiled with C2 but still can with C1, compile it with
// pure C1.
if (!can_be_compiled(mh, level)) {
if (level == CompLevel_full_optimization && can_be_compiled(mh, CompLevel_simple)) {
compile(mh, bci, CompLevel_simple, THREAD);
}
return;
}
{- -------------------------------------------
(1) もし要求されたのが OSR 用のコンパイル (= bci が InvocationEntryBci ではない) なのに,
対象のメソッドが OSR 用の JIT コンパイルが禁止されている (= methodOopDesc::is_not_osr_compilable() が false) 場合,
どうしようもないので, ここでリターン.
---------------------------------------- -}
if (bci != InvocationEntryBci && mh->is_not_osr_compilable()) {
return;
}
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
if (PrintTieredEvents) {
print_event(COMPILE, mh, mh, bci, level);
}
{- -------------------------------------------
(1) 同じ JIT コンパイル要求が既に出されていたら (= CompileBroker::compilation_is_in_queue() が true),
することはないので, ここでリターン.
---------------------------------------- -}
if (!CompileBroker::compilation_is_in_queue(mh, bci)) {
{- -------------------------------------------
(1) SimpleThresholdPolicy::submit_compile() を呼んで, JIT コンパイル処理を開始する.
---------------------------------------- -}
submit_compile(mh, bci, level, THREAD);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.