llvm について
LLVM ツールを使うエージェント向けに、IR の生成と確認、最適化、アセンブリへの変換を案内します。最適化が適用されない原因の調査も扱い、独自の LLVM pass 作成には別のスキルを案内します。
主な機能
- 01テキスト IR と bitcode の生成
- 02opt による最適化 pass の実行
- 03llc によるアセンブリへの変換
- 04IR の命令と構造の確認
- 05最適化未適用の原因調査
活用シーン
- 01C 関数から生成された LLVM IR の確認
- 02IR への最適化 pass の適用
- 03ループが自動ベクトル化されない原因の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill llvmインストール後、Claude Code で/llvmを入力して読み込まれたか確認します。
同梱ファイルreferences/ir-reference.md
詳細
LLVM IR とツール
目的
エージェントが ユーザー として LLVM を活用するためのガイドです。IR の生成と確認、opt を使用した既存の最適化パスの実行、llc を使用したアセンブリへの変換、最適化が行われない原因の診断を扱います。新しい LLVM パスの作成(PassPlugin、llvm-lit によるテスト)については、代わりに skills/compiler-internals/llvm-passes を使用してください。
トリガー
- 「この関数の LLVM IR を見せて」
- 「LLVM の最適化パスはどう実行しますか?」
- 「この LLVM IR の命令は何を意味しますか?」
- 「カスタム LLVM パスはどう書きますか?」
- 「LLVM で自動ベクトル化されないのはなぜですか?」
ワークフロー
1. LLVM IR を生成する
# Emit textual IR (.ll)
clang -O0 -emit-llvm -S src.c -o src.ll
# Emit bitcode (.bc)
clang -O2 -emit-llvm -c src.c -o src.bc
# Disassemble bitcode to text
llvm-dis src.bc -o src.ll
2. opt で最適化パスを実行する
# Apply a specific pass
opt -passes='mem2reg,instcombine,simplifycfg' src.ll -S -o out.ll
# Standard optimisation pipelines
opt -passes='default<O2>' src.ll -S -o out.ll
opt -passes='default<O3>' src.ll -S -o out.ll
# List available passes
opt --print-passes 2>&1 | less
# Print IR before and after a pass
opt -passes='instcombine' --print-before=instcombine --print-after=instcombine src.ll -S -o out.ll 2>&1 | less
3. llc で IR をアセンブリに変換する
# Compile IR to object file
llc -filetype=obj src.ll -o src.o
# Compile to assembly
llc -filetype=asm -masm-syntax=intel src.ll -o src.s
# Target a specific CPU
llc -mcpu=skylake -mattr=+avx2 src.ll -o src.s
# Show available targets
llc --version
4. IR を確認する
理解しておくべき主な IR 構造:
| 構造 | 意味 |
|---|---|
alloca | スタック割り当て(SSA 導入前。mem2reg によりレジスターに昇格します) |
load/store | メモリーアクセス |
getelementptr (GEP) | ポインター演算/フィールドアクセス |
phi | SSA φ ノード:先行ブロックからの値を統合します |
call/invoke | 関数呼び出し(invoke には例外エッジがあります) |
icmp/fcmp | 整数/浮動小数点数の比較 |
br | 分岐(条件付きまたは無条件) |
ret | 戻り |
bitcast | ビットを再解釈します(コード生成では何もしません) |
ptrtoint/inttoptr | ポインター↔整数(可能な限り避けてください) |
5. 主なパス
| パス | 効果 |
|---|---|
mem2reg | alloca を SSA レジスターに昇格します |
instcombine | 命令の結合/ピープホール最適化 |
simplifycfg | CFG のクリーンアップ、デッドブロックの削除 |
loop-vectorize | 自動ベクトル化 |
slp-vectorize | スーパーワードレベルの並列処理(直線的なコードのベクトル化) |
inline | 関数のインライン化 |
gvn | グローバル値番号付け(共通部分式の削除) |
licm | ループ不変コードの移動 |
loop-unroll | ループのアンローリング |
argpromotion | ポインター引数を値に昇格します |
sroa | 集約型のスカラー置換 |
6. 最適化が行われない場合のデバッグ
# Why was a loop not vectorised?
clang -O2 -Rpass-missed=loop-vectorize -Rpass-analysis=loop-vectorize src.c
# Dump pass pipeline
clang -O2 -mllvm -debug-pass=Structure src.c -o /dev/null 2>&1 | less
# Print IR after each pass (very verbose)
opt -passes='default<O2>' -print-after-all src.ll -S 2>&1 | less
7. 便利な LLVM ツール
| ツール | 用途 |
|---|---|
llvm-dis | ビットコード → テキスト形式の IR |
llvm-as | テキスト形式の IR → ビットコード |
llvm-link | 複数のビットコードファイルをリンク |
llvm-lto | 単独での LTO |
llvm-nm | ビットコード/オブジェクト内のシンボル |
llvm-objdump | オブジェクトの逆アセンブル |
llvm-profdata | PGO プロファイルのマージ/表示 |
llvm-cov | カバレッジレポート |
llvm-mca | マシンコードアナライザー(スループット/レイテンシー) |
binutils に相当するツールについては、skills/binaries/binutils を参照してください。
関連スキル
- カスタム LLVM パスの作成とテストには、
skills/compiler-internals/llvm-passesを使用してください - AST から LLVM IR を生成するには、
skills/compiler-internals/compiler-frontendを使用してください - LLVM IR の ORC JIT 実行には、
skills/compiler-internals/jit-compilationを使用してください - ソースレベルの Clang フラグには、
skills/compilers/clangを使用してください - リンク時の LTO には、
skills/binaries/linkers-ltoを使用してください - マイクロアーキテクチャー分析には、
skills/profilers/linux-perfをllvm-mcaと組み合わせて使用してください
コメント
Markdown 対応