yarv2llvmの進捗状況

今回は(も?)、あまり面白くない変更ですが自分用にメモします。

  1. 式が定数だった場合畳み込みをするようにしました
  2. 比較の結果(Booleanまたは(TrueClass/FalseClass))をサポートしました
  3. Fixnum#timesをサポートしました。これをサポートするに当たってインライン化するイテレータが簡単に書けるようにリファクタリングしました。
  4. 組み込みメソッドやインライン化されるメソッドの再定義が出来るようになりました。まだ不完全です。

最初の定数の畳み込みについては、補足がいるかなと思います。もちろん、最適化の強力なLLVMは定数の畳み込みは朝飯前です。でも、こんな場合はどうでしょう?

 FOO = 1 + 1
 p FOO

一見、p 2というコードを出力すればいいように見えますが、定数の畳み込みをLLVMに任せてしまうと、次のようなコードができてしまいます。

  • 1 + 1の計算をする
  • FOOに1+1の結果を格納する(rb_const_setの呼び出し)
  • FOOの結果を取り出す(rb_const_getの呼び出し)
  • 結果をpの引数にして呼び出す

ここで、最初の1 + 1は確かに2に畳み込まれますが、rb_const_set, rb_const_getの呼び出しはさすがに畳み込んでくれません。
一方、yarv2llvmで畳み込めばFOOは2ということがコンパイル時にわかるのでrb_const_set, rb_const_getは呼び出さなくなります。