hotspot/src/share/vm/runtime/compilationPolicy.cpp
const char* StackWalkCompPolicy::shouldInline(methodHandle m, float freq, int cnt) {
{- -------------------------------------------
(1) (この関数は, インライン展開してよいと判断した場合 NULL を返す.
ダメと判断した場合, ダメな理由を表す文字列を返す)
---------------------------------------- -}
// Allows targeted inlining
// positive filter: should send be inlined? returns NULL (--> yes)
// or rejection msg
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
int max_size = MaxInlineSize;
int cost = m->code_size();
{- -------------------------------------------
(1) 対象のメソッドがインタープリタ実行中に例外によって終了した回数が InlineThrowCount を超えていれば
(かつ, 対象のメソッドのバイトコード数が InlineThrowMaxSize を超えていなければ)
NULL をリターンする (= インライン展開してよい).
(<= 意図としては恐らく, 例外脱出が多すぎるメソッドは
インライン展開で脱出をメソッド内ジャンプにできれば嬉しい, ということ(?))
(なお, 例外によって終了した回数は
InterpreterRuntime::exception_handler_for_exception() 内でカウントしている.
See: InterpreterRuntime::exception_handler_for_exception())
---------------------------------------- -}
// Check for too many throws (and not too huge)
if (m->interpreter_throwout_count() > InlineThrowCount && cost < InlineThrowMaxSize ) {
return NULL;
}
{- -------------------------------------------
(1) (変数宣言など)
(max_size の調整)
---------------------------------------- -}
// bump the max size if the call is frequent
if ((freq >= InlineFrequencyRatio) || (cnt >= InlineFrequencyCount)) {
if (TraceFrequencyInlining) {
tty->print("(Inlined frequent method)\n");
m->print();
}
max_size = FreqInlineSize;
}
{- -------------------------------------------
(1) 対象のコードサイズが閾値(max_size)を超えていれば,
非NULL の値をリターンする (= インライン展開してはダメ).
そうでなければ NULL をリターンする (= インライン展開してよい).
なお, 閾値には以下のどちらかの値が使われる
(よく呼び出されているメソッドの場合はインライン展開の効果が大きいので, 閾値も少し大きいもの(FreqInlineSize)を使う模様)
* 引数の freq (呼び出し元メソッドが1回の呼び出しでこのメソッドを呼び出す平均回数) が InlineFrequencyCount 以上, もしくは
引数の cnt (呼び出し元がこのメソッドを呼び出した合計回数) が InlineFrequencyCount 以上の場合:
=> FreqInlineSize
* それ以外の場合:
=> MaxInlineSize
---------------------------------------- -}
if (cost > max_size) {
return (_msg = "too big");
}
return NULL;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.