2008-10-11
データフロー解析もどきが出来るようになった
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
}
コメントを書く
トラックバック - http://d.hatena.ne.jp/miura1729/20081011/1223718076
リンク元
- 4 http://www.rubyist.net/~kazu/samidare/
- 1 http://d.hatena.ne.jp/keyword/Ruby
- 1 http://d.hatena.ne.jp/tazant/20080823/1219491744
- 1 http://fastladder.com/reader/
- 1 http://github.com/miura1729
- 1 http://github.com/miura1729/yarv2llvm/tree/master
- 1 http://www.google.co.jp/search?hl=ja&rls=DVFC,DVFC:1970--2,DVFC:ja&q=Ypsilon+Scheme+&btnG=検索&lr=