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"]