ruby-trunk-changes r62648 - r62655

今日は主に MJIT の例外の処理に関する最適化などがありました。

nobu: r62648 2018-03-04 10:52:19 +0900

vm_exec_core() で rb_ec_thread_ptr() を繰り返し呼んでいたのを変数に受けて使いまわすようにしています。

svn: r62649 2018-03-04 10:52:20 +0900

version.h の日付更新。

nobu: r62650 2018-03-04 11:09:47 +0900

vm.c の vm_exec() で vm_exec_core() を呼び出す部分を EC_EXEC_TAG() の結果をチェックする if 文の中に書いて外からそこに goto でジャンプさせていたのを、外に出してここからそちらに goto するようにしています。でもまた次でここのへん変更されてる。

nobu: r62652 2018-03-04 11:37:22 +0900

vm_exec() から TH_TAG_JUMP() で大域脱出してきた時のコードの大部分を handle_exception() という関数に切り出すリファクタリング
まあそれはいいんですが、これにより結局 goto vm_loop_start は if 文の別の分岐にジャンプするようになっているという。

nobu: r62653 2018-03-04 15:24:38 +0900

r62652 の続きで vm_exec() で vm_exec_core() の呼び出しを vm_loop_start ラベルの後からその直前(goto でジャンプする前も)に移動しています。例外処理時に不要な分岐をしないようにしているようです。

k0kubun: r62654 2018-03-04 16:04:28 +0900

compile.c で ISeq が例外を rescue や ensure で捕捉して実行する可能性がある場合に立てるフラグ rb_iseq_body_t::catch_except_p というメンバーを追加しています。MJIT での最適化のために使う予定とのこと。

k0kubun: r62655 2018-03-04 16:04:40 +0900

r62654 で追加した rb_iseq_body_t::catch_except_p を利用して、例外を処理する必要がない ISeq を MJIT でコンパイルする際には、mjit_exec() を直接呼んで不要な TAG_PUSH() を抑制しています。さらに struct compile_status::local_stack_p というフラグもセットして、MJIT コンパイル時に本来 VM スタックに乗せる値を C のローカル変数で取り回すようにする最適化も行なっているようです。 [ruby-core:84451] [Feature #14235]