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 

これでどんくさいコンパイラしか書けなくても大丈夫、ということではないけれど、面白いなぁ。