ruby-trunk-changes r67530 - r67549

今日は MJIT で inline cache 利用する最適化の失敗でコンパイルできなかった時に最適化をオフにして再コンパイルするようにする変更などがありました。

k0kubun: r67530 2019-04-14 13:52:02 +0900

MJIT で compile option を指定する struct rb_mjit_compile_info という構造体を導入して、ivar cache や send cache などの最適化の失敗でコンパイルがキャンセルされた時にこれらの最適化を off にしてコンパイルをリトライするようにしています。

svn: r67531 2019-04-14 13:52:04 +0900

version.h の日付更新。

k0kubun: r67532 2019-04-14 14:26:23 +0900

r67530 で導入した MJIT の再コンパイルのテストを i686 Linux では skip するようにしています。再コンパイルが実行されないとのこと。

k0kubun: r67533 2019-04-14 14:26:46 +0900

mjit*.{hc} や MJIT 用のソース生成ツールが作るソースコード内での C のコメントを /* */ のスタイルから // の行コメントに変更しています。

k0kubun: r67534 2019-04-14 14:40:18 +0900

r67532 のテストのスキップで正規表現とマッチさせるつもりで == と書いてたので =~ に修正。

k0kubun: r67535 2019-04-14 14:48:38 +0900

.travis.yml の大量の build matrix を一旦消して MJIT のテストのみ行うようにしています。デバッグのためとのこと。

k0kubun: r67536 2019-04-14 14:48:39 +0900

r67532 および r67534 の MJIT の再コンパイルテストの skip を revert しています。

k0kubun: r67537 2019-04-14 14:48:40 +0900

r67530 の再修正で mjit_add_iseq_to_process() で引数の struct rb_mjit_compile_info が NULL だった時に明示的に各種オプションを false に指定して最適化有効にするようにしています。初期化されてないので元から最適化が無効でコンパイルされるので再コンパイルされないという場合があったみたいですね。

k0kubun: r67538 2019-04-14 14:52:14 +0900

と、思ったらやっぱり r67537 は revert されて r67535 と r67536 も revert されました。これらはブランチで(Travis-CI を走らせて)デバッグするだけで trunk にコミットするつもりじゃなかったのがうっかり入っちゃったみたいです。 r67537 は入れてもよさそうだけど。

hsbt: r67539 2019-04-14 15:01:35 +0900

添付 bunlder を 2.1.0.pre.1 に更新しています。

hsbt: r67540 2019-04-14 15:02:47 +0900

r67539 の bundler の spec に require "rspec" を追加しています。

hsbt: r67541 2019-04-14 15:03:58 +0900

r67539 の bundler の更新で rubyリポジトリに入れてるせいで失敗するテストにタグを追加して skip させるようにしています。

hsbt: r67542 2019-04-14 15:05:27 +0900

逆に r67541 で入った bundler のテストのうちいくつかはタグを外して実行対象にしています。

kazu: r67543 2019-04-14 15:52:37 +0900

r67347 で .travis.yml に追加した Travis-CI の macOS での並列ビルド時の Permission Error のデバッグのために追加したエラー時に実行するコマンドに ext/ と ext/bigdecimal/ の ls の結果も表示させるように追加しています。

k0kubun: r67544 2019-04-14 15:57:21 +0900

debug counters が有効にビルドされている時に RubyVM.reset_debug_counters というメソッドでカウンタをリセットできるようにしています。debug counters って確かプロセス終了時に表示するって感じだったと思うから、おそらくプロセス起動時とかファイルのロードなどに起きるイベントのぶんを除外して、知りたい処理の間のカウントだけしたいっていう時に使うんでしょうね。

k0kubun: r67545 2019-04-14 16:10:34 +0900

r67544 の再修正。 MJIT 関係の一部のカウンタは実際にはカウンタではなくて増減可能な変数で、これをリセットしてしまうと負になってしまうのでリセット対象にしないようにしています。

k0kubun: r67546 2019-04-14 16:12:44 +0900

debug counters に MJIT の length_stale_units というカウンタを追加して stale_units リストのサイズを記録するようにしています。

k0kubun: r67547 2019-04-14 17:33:43 +0900

MJIT の JIT 時のコード生成用の C コードを生成するテンプレート tool/ruby_vm/views/mjit_compile.inc.erb で opt_aref, opt_aset と opt_mod の命令のコンパイル時に inline call cache が効いてない時に(?) mjit_compile_insn というテンプレートを使う方法に fallback するようにしている、と思う。さすがに C のコード生成する C のコードを生成する ERB を観てるだけだとぱっと見では理解不能ですね。せめて render してできた C のコードみてみないと。

k0kubun: r67548 2019-04-14 17:53:19 +0900

r67547 の追加修正で send 最適化対象の VM 命令を send_compatible_opt_insns という変数に入れておいて、opt_ で始まって CALL_SIMPLE_METHOD フラグがついてる命令は自動に入るようにしています。

k0kubun: r67549 2019-04-14 18:31:24 +0900

r67530 の MJIT 再コンパイルのテストを r67532 で i686 で skip するようにしてましたが、これは rb_mjit_recompile_iseq() で LAST_JIT_ISEQ_FUNC を ptrdiff_t にキャストして比較してたけど uintptr_t に修正しています。であらためてテストの skip を消しています。 https://github.com/ruby/ruby/pull/2130