Top


定義場所(file name)

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

説明(description)

// Check if the method can be compiled, change level if necessary

名前(function name)

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

本体部(body)

  {- -------------------------------------------
  (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.