Top


定義場所(file name)

hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp

説明(description)

// Handle the back branch event. Notice that we can compile the method
// with a regular entry from here.

名前(function name)

void SimpleThresholdPolicy::method_back_branch_event(methodHandle mh, methodHandle imh,
                                               int bci, CompLevel level, TRAPS) {

本体部(body)

  {- -------------------------------------------
  (1) 以下のどれかに該当する場合は, 以降の処理は行わない. (= ここでリターン)

      * JIT コンパイル処理を行ってはいけない状況 (= CompilationPolicy::is_compilation_enabled() が false) の場合
      * 同じ JIT コンパイル要求が既に出されていた場合 (= CompileBroker::compilation_is_in_queue() が true)
      ---------------------------------------- -}

      // If the method is already compiling, quickly bail out.
      if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, bci)) {

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

        // Use loop event as an opportinity to also check there's been
        // enough calls.
        CompLevel cur_level = comp_level(mh());
        CompLevel next_level = call_event(mh(), cur_level);
        CompLevel next_osr_level = loop_event(mh(), level);

        next_level = MAX2(next_level,
                          next_osr_level < CompLevel_full_optimization ? next_osr_level : cur_level);

  {- -------------------------------------------
  (1) 以下の条件が成り立つ場合は, メソッド全体もしくはループだけの JIT コンパイル処理を行う.
      (成り立たない場合は何もしない)

      * SimpleThresholdPolicy が, メソッド全体の JIT コンパイルレベルを現在より上げた方がいい, と判定した場合:
        (= SimpleThresholdPolicy::call_event() もしくは SimpleThresholdPolicy::loop_event() の返値が
        対象メソッドの現在のコンパイルレベルとは異なる場合)

        SimpleThresholdPolicy::compile() を呼んで, メソッド全体の JIT コンパイル処理を行う.

      * SimpleThresholdPolicy が, メソッド全体のコンパイルレベルはそのままでいいが, 
        対象のループの JIT コンパイルレベルは現在より上げた方がいい, と判定した場合:
        (= SimpleThresholdPolicy::loop_event() の返値が level 引数の値と異なる場合)

        SimpleThresholdPolicy::compile() を呼んで, ループだけの JIT コンパイル処理を行う.
      ---------------------------------------- -}

        bool is_compiling = false;
        if (next_level != cur_level) {
          compile(mh, InvocationEntryBci, next_level, THREAD);
          is_compiling = true;
        }

        // Do the OSR version
        if (!is_compiling && next_osr_level != level) {
          compile(mh, bci, next_osr_level, THREAD);
        }
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.