Scheme Compiler の勉強(26) - リファクタリング一応完了
やっと S 式 -> S 式での LLVM IR -> LLVM という流れができ、テストが通った。いままでは S 式 -> LLVM というシンプルな作りだった。
ただし、まだ足し算程度しかできず、何より cons が無い。これからだ。
gosh> (map pprint-ir (program->insts '(letrec ((fib (lambda (x) (if (fx<= x 2) 1 (fx+ (fib (fx- x 1)) (fib (fx- x 2))))))) (fib 26)))) (define-function i32 scheme_entry () (assign %ret (alloca i32)) (store (i32 104) (i32* %ret)) (assign %var288 (load (i32* %ret))) (assign %var287 (call i32 Label_33 ((i32 %var288)))) (store (i32 %var287) (i32* %ret)) (assign %retval (load (i32* %ret))) (ret (i32 %retval)) ) (define-function i32 Label_33 ((i32 %arg1)) (assign %ret (alloca i32)) (assign %sta73 (alloca i32)) (store (i32 %arg1) (i32* %sta73)) (assign %var263 (load (i32* %sta73))) (store (i32 %var263) (i32* %ret)) (assign %sta74 (alloca i32)) (assign %var259 (load (i32* %ret))) (store (i32 %var259) (i32* %sta74)) (store (i32 8) (i32* %ret)) (assign %sta75 (alloca i32)) (assign %var260 (load (i32* %ret))) (store (i32 %var260) (i32* %sta75)) (assign %var261 (load (i32* %sta74))) (assign %var262 (load (i32* %sta75))) (assign %var264 (icmp sle (i32 %var261 %var262))) (assign %var265 (select (i1 %var264) (i32 111) (i32 47))) (store (i32 %var265) (i32* %ret)) (assign %var257 (load (i32* %ret))) (assign %var258 (icmp eq (i32 %var257 47))) (br (i1 %var258) Label_35 Label_34) (label Label_34) (store (i32 4) (i32* %ret)) (br Label_36) (label Label_35) (assign %var276 (load (i32* %sta73))) (store (i32 %var276) (i32* %ret)) (assign %sta78 (alloca i32)) (assign %var272 (load (i32* %ret))) (store (i32 %var272) (i32* %sta78)) (store (i32 4) (i32* %ret)) (assign %sta79 (alloca i32)) (assign %var273 (load (i32* %ret))) (store (i32 %var273) (i32* %sta79)) (assign %var274 (load (i32* %sta78))) (assign %var275 (load (i32* %sta79))) (assign %var277 (sub (i32 %var274 %var275))) (store (i32 %var277) (i32* %ret)) (assign %var271 (load (i32* %ret))) (assign %var270 (call i32 Label_33 ((i32 %var271)))) (store (i32 %var270) (i32* %ret)) (assign %sta76 (alloca i32)) (assign %var266 (load (i32* %ret))) (store (i32 %var266) (i32* %sta76)) (assign %var284 (load (i32* %sta73))) (store (i32 %var284) (i32* %ret)) (assign %sta80 (alloca i32)) (assign %var280 (load (i32* %ret))) (store (i32 %var280) (i32* %sta80)) (store (i32 8) (i32* %ret)) (assign %sta81 (alloca i32)) (assign %var281 (load (i32* %ret))) (store (i32 %var281) (i32* %sta81)) (assign %var282 (load (i32* %sta80))) (assign %var283 (load (i32* %sta81))) (assign %var285 (sub (i32 %var282 %var283))) (store (i32 %var285) (i32* %ret)) (assign %var279 (load (i32* %ret))) (assign %var278 (call i32 Label_33 ((i32 %var279)))) (store (i32 %var278) (i32* %ret)) (assign %sta77 (alloca i32)) (assign %var267 (load (i32* %ret))) (store (i32 %var267) (i32* %sta77)) (assign %var268 (load (i32* %sta76))) (assign %var269 (load (i32* %sta77))) (assign %var286 (add (i32 %var268 %var269))) (store (i32 %var286) (i32* %ret)) (br Label_36) (label Label_36) (assign %retval (load (i32* %ret))) (ret (i32 %retval)) )