LLVM-C API を使った自作コンパイラでの、phi の話
対象
#LLVM-C 初学者
内容
https://github.com/mzuhi5/tiny_c_compiler/tree/main の話の続き。
LLVM を使うからには通るであろう phi の話。
LLVM IR は SSA(static single assignment form) を使っている。つまりレジスタを使用した変数が一度代入すると変更不可能で、変えた値を保持するには新しい変数を使わなきゃいけない。読んだ話では、こうすることで最適化がしやすくなるからだとか。
条件分岐などで変数の値が変化した場合、分岐先のどちらの値を使用するのかの決定に、phi 命令を使う。
多くの説明がネットにあるので、そちらを参照。自分が参考にしたのは、公式のチュートリアルのここ。
ひとつメモしておきたいことがあって、これはレジスタでやる場合は必要だけれども、スタックに値を突っ込んでしまえば必要なくなるということ。ポインタ自体は SSA 縛りだけど、その先のメモリの中身は上書き可能なので。効率を無視した今回のコンパイラでは、論理演算の一箇所しか phi は使ってなくて、後は全部スタック越し。