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))
)

http://d.hatena.ne.jp/cranebird/20081005/1223214618