hotspot/src/share/vm/runtime/compilationPolicy.cpp
// Returns true if m is allowed to be compiled
bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) {
{- -------------------------------------------
(1) 以下の条件のどれかに当てはまる場合は, false をリターン.
そうでなければ true をリターン.
* 対象のメソッドが abstract method の場合
* DontCompileHugeMethods オプションが指定されており,
かつ対象のメソッドのバイトコード数が HugeMethodLimit を超えている場合
* 対象のメソッドに対して, AbstractInterpreter::can_be_compiled() が false を返す場合
(この判定はプラットフォームによって異なるが, x86 上では数学関数がコンパイル禁止になっている.
ただしコメントによると, 製品用のビルド時にはそもそも数学関数の InvocationCounter が増加しないので, これはデバッグビルド時用の条件, とのこと)
* 対象のメソッドの methodOopDesc::is_not_compilable() が true を返す場合.
ただし, 引数の comp_level の値に応じて少し内容が変わる.
* comp_level が CompLevel_all (= デフォルト引数値) の場合:
CompLevel_simple 及び CompLevel_full_optimization のどちらかで true を返せば false.
* それ以外の場合
引数で指定された comp_level で true を返せば false.
---------------------------------------- -}
if (m->is_abstract()) return false;
if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false;
// Math intrinsics should never be compiled as this can lead to
// monotonicity problems because the interpreter will prefer the
// compiled code to the intrinsic version. This can't happen in
// production because the invocation counter can't be incremented
// but we shouldn't expose the system to this problem in testing
// modes.
if (!AbstractInterpreter::can_be_compiled(m)) {
return false;
}
if (comp_level == CompLevel_all) {
return !m->is_not_compilable(CompLevel_simple) && !m->is_not_compilable(CompLevel_full_optimization);
} else {
return !m->is_not_compilable(comp_level);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.