LLVM と MLIR
LLVM はモジュール式のコンパイラ基盤。SSA 形式の LLVM IR を中心に、最適化を Pass のパイプラインとして適用する(ループ最適化 Pass など)。多くのコンパイラ最適化研究(Pluto の polyhedral、register allocation 等)が LLVM Pass として実装される。Rust の inkwell クレートで LLVM をバインドできる。
MLIR
MLIR (Multi-Level Intermediate Representation) は、コンパイラのどの段階でも使える中間表現フレームワーク。深層学習の流行で各種コンパイラが独自 IR をスクラッチ実装し品質がばらつく問題を解決するために登場した。LLVM IR の前段に位置する。
- 組み込みのオペレーションを持たず、全 ops は Pass によって処理される(未知 op を Pass が解釈することを期待)。
- 型システムとして「スカラ」「ベクトル」「テンソル」を定義可能。
- 各命令は opcode と source location、SSA の results/operands、Attributes、Block operands、Regions を持つ。
- 典型フロー:
ToyAST → MLIR → LLVM IR → Machine Code。Generic DAG Rewriter による書き換え基盤も持つ。Clang IR (CIR) のように LLVM IR の上に中間言語を作る動きもある。
関連
- 適用される最適化はcompiler-optimization、Rust からの利用はrust-lang。
- 自作コンパイラ例はtoy-llvm-compiler・llvm-riscv-backend。
- _moc-prog-lang