エスケープ解析うまく行きそうです

ちょっと試してみたら、結構うまく行きそうです。でも、ちゃんとチェックしないと訳の分からないGCのエラーでひどい目にあいそうなので、しっかりチェックします。
変更点がここにあります。
http://github.com/miura1729/yarv2llvm/commit/83758bd5c935227b4f62add3fbcaba4ebeb393c5

次のサンプルプログラムをコンパイルしたときにnewメソッドで返される新しいオブジェクトがローカルでとどまるか(local)、メソッドの外に出て行ってしまうか(global)を表示しています。

class TestClass0
  def initialize(a)
    @a = a
    nil
  end
end

def escape_test0
  foo = Array.new
  foo[1] = 1
  bar = TestClass0.new(foo)
  nil
end

class TestClass1
  def initialize(a)
    @a = a
    $foo = a
    nil
  end
end

def escape_test1
  foo = Array.new
  foo[1] = 1
  bar = TestClass1.new(foo)
  nil
end

class TestClass2
  def initialize(a)
    @a = a
    nil
  end
end

def escape_test2
  foo = Array.new
  foo[1] = 1
  bar = TestClass2.new(foo)
end

class TestClass3
  def initialize(a)
    @a = a
    nil
  end
end

def escape_test3
  foo = Array.new
  foo[1] = 1
  bar = TestClass3.new([])
end

出力結果。左から、メソッド名、newメソッドのレシーバ、-> 結果(local, global)です。

escape_test0 Array -> local
escape_test0 TestClass0 -> local
escape_test1 Array -> global
escape_test1 TestClass1 -> local
escape_test2 Array -> global
escape_test2 TestClass2 -> global
escape_test3 Array -> local
escape_test3 TestClass3 -> global