データフロー解析もどきが出来るようになった
yarv2llvmを相変わらず作っています。if文で分岐する場合も対応できるようになりました。llvm命令の中でも峠らしいPHI命令を使っています。生成したコードはまだ動かしていないのですが果たしてうまく行くのか・・・。
今後はコードがめちゃめちゃ汚いので、リファクタリングしないとなと思っています。github(http://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 }