関数間の型推論を作りました

関数の呼び出し情報を使って型推論をする機能を入れてみました。あまり、使いどころは無いような気がしますが(必要なら+ 0.0とか入れて型を指定すればいいから)、面白いかなと思います。

def fact(n)
  n
end

def llvmfib(n)
  fact(3.9)
  if n < 2 then
    1
  else
    llvmfib(n - 1) + llvmfib(n - 2)
  end
end

例えば、こんな感じのプログラムでfactは型が不明ですが、llvmfibで3.9を引数で呼び出しているので、factはDouble -> Doubleと型推論できます。

define double @fact(double) {
bb:
	%1 = alloca double		; <double*> [#uses=2]
	store double %0, double* %1
	br label %bb1

bb1:		; preds = %bb
	%2 = load double* %1		; <double> [#uses=1]
	ret double %2
}