データフロー解析もどきが出来るようになった

yarv2llvmを相変わらず作っています。if文で分岐する場合も対応できるようになりました。llvm命令の中でも峠らしいPHI命令を使っています。生成したコードはまだ動かしていないのですが果たしてうまく行くのか・・・。
今後はコードがめちゃめちゃ汚いので、リファクタリングしないとなと思っています。githubhttp://github.com/miura1729/yarv2llvm/tree/master)に上げておきます。

こんな感じになります。

追記
PHI命令はブロックの先頭にしか来れないみたいです。命令をファイルに書き出してoptしたら怒られました。

追記2
この例ではoptが通る様にしました。

ソースコード

def bar(n, m)
    n + if m == 10 then 
          1.0*n 
        elsif m == 20 then 
          1.0 
        else
          2.0 * n 
        end
end

llvmコード

; ModuleID = 'yarv2llvm'

declare void @abort()

define float @bar(float, i32) {
bb:
	%2 = alloca i32		; <i32*> [#uses=2]
	%3 = alloca float		; <float*> [#uses=3]
	br label %bb1

bb1:		; preds = %bb
	%4 = load i32* %2		; <i32> [#uses=1]
	%5 = icmp eq i32 %4, 10		; <i1> [#uses=1]
	br i1 %5, label %bb2, label %bb3

bb2:		; preds = %bb1
	%6 = load float* %3		; <float> [#uses=1]
	br label %bb4

bb3:		; preds = %bb1
	%7 = load i32* %2		; <i32> [#uses=1]
	%8 = icmp eq i32 %7, 20		; <i1> [#uses=1]
	br i1 %8, label %bb5, label %bb6

bb4:		; preds = %bb6, %bb5, %bb2
	%9 = load float* %3		; <float> [#uses=1]
	%10 = phi float [ %13, %bb6 ], [ 1.000000e+00, %bb5 ], [ %6, %bb2 ]		; <float> [#uses=1]
	%11 = add float %9, %10		; <float> [#uses=1]
	ret float %11

bb5:		; preds = %bb3
	br label %bb4

bb6:		; preds = %bb3
	%12 = load float* %3		; <float> [#uses=1]
	%13 = mul float 2.000000e+00, %12		; <float> [#uses=1]
	br label %bb4
}