配列の型推論ができた

配列の型推論が出来るようになりました。

    YARV2LLVM::compile(<<-EOS
def arr1()
  a = []
  a[0] + 1
  a
end

def arr2()
  a = []
  a[0] + 1.0
  a
end
EOS
)
arr1 :() -> Array of Int32Ty
arr2 :() -> Array of FloatTy

a[0] + 1でnilと1を足しているじゃないかと突っ込まれると思いますが、こればっかりは動的に型チェックしないといかんかなと思います。今はまだ型チェックが組み込んでないのでこんなコードがコンパイラを通ってしまいます。さらに、まだ配列の書き込み([]=メソッド)ができてないです。
配列ライブラリはRubyのものを使うので、結果はVALUE型で返って来ます。その後、ここの変数の型に変換するのでここで型チェックができるかなと思います。配列を参照するたびに型変換が入るので効率が悪いです。でも、型変換をなくすようにするとRubyの配列ライブラリ相当のものを作り直さないといけないので(GCも含めて)めちゃめちゃつらいです。

あと、静的に配列の大きさが決められるならエスケープ解析して、配列をメソッドの外に持ち出してないならallocaでスタック上に取ることができて、簡単・速度すごく向上 なんですが、静的に配列の大きさを決めるにはどうしようって悩んでいます。ここまで来たら配列のサイズの宣言を入れるってのも嫌だなーと思うし。