Scheme Compiler の勉強 (12) - LLVM opt による最適化
作成した貧弱なコンパイラによる冗長なコードを llvm-ac で.bc(バイナリ)を生成。この中間コードのバイナリ .bc にたいして opt コマンドで最適化し、それから PowerPC のコードをllcで吐かせる。
;; tests-driver.scm に追加 (unless (zero? (system "opt -std-compile-opts stst.bc -f -o stst.opt.bc")) (error "fail to llc to generate stst.opt.bc")) ;; gosh> (build-program '($fxadd1 ($fxadd1 ($fxadd1 ($fxadd1 ($fxadd1 ($fxadd1 12))))))) #<undef>
最終のアセンブラ結果で見ると、以下のようないかにも冗長なコンパイル結果が、
_scheme_entry: li r2, 48 stw r2, -4(r1) li r2, 52 stw r2, -4(r1) li r2, 56 stw r2, -4(r1) li r2, 60 stw r2, -4(r1) li r2, 64 stw r2, -4(r1) li r2, 68 stw r2, -4(r1) li r3, 72 stw r3, -4(r1) blr
期待通りこんなにもシンプルに!
_scheme_entry: li r3, 72 blr
これでどんくさいコンパイラしか書けなくても大丈夫、ということではないけれど、面白いなぁ。