Arantium Maestum

プログラミング、囲碁、読書の話題

HaskellでLisp to LLVM IRコンパイラ その3 LLVM IRへの出力(数字の出力)

前回に続いてLLVM IRで数字を返す方法を考える。

比較的簡単でこのような形になる:

%1 = alloca i32
store i32 3, i32* %1
%2 = load i32, i32* %1
  • スタック上に%1という変数をalloca命令で用意する
  • %1に3という値を代入
  • %1に含まれている値を一時変数%2に代入

という流れだ。基本的にスタック上の変数の値は直接関数に渡したり返したりすることはできず、いったん一時変数に代入してから一時変数を引数・戻り値として使う。ちなみに一度代入された一時変数は(ジャンプによってループしない限り)二度と代入されることがない、というのがStatic Single Assignmentの特徴。

LLVM IRで数字を表現するには、スタック変数、一時変数の名前がユニークであることを保証した上で上記の三つのコードを吐き出せばいいということになる。

必要のない部分は全部削除したとはいえ、上記のLLVM表現はまだすこし読みにくいので:

[Alloca "s1", Store "s1" 3, Load "a1" "s1"]

といったSSAデータ型を中間言語として定義して、それを機械的LLVM IRに変換していくことにする。

次回はこの独自のSSA中間言語の話。