mcpField
L
llvm

llvm

github.com/mohitmishra786開発269912 回インストール18 週間前に更新
リポジトリ

llvm について

LLVM ツールを使うエージェント向けに、IR の生成と確認、最適化、アセンブリへの変換を案内します。最適化が適用されない原因の調査も扱い、独自の LLVM pass 作成には別のスキルを案内します。

主な機能

  1. 01テキスト IR と bitcode の生成
  2. 02opt による最適化 pass の実行
  3. 03llc によるアセンブリへの変換
  4. 04IR の命令と構造の確認
  5. 05最適化未適用の原因調査

活用シーン

  1. 01C 関数から生成された LLVM IR の確認
  2. 02IR への最適化 pass の適用
  3. 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)ポインター演算/フィールドアクセス
phiSSA φ ノード:先行ブロックからの値を統合します
call/invoke関数呼び出し(invoke には例外エッジがあります)
icmp/fcmp整数/浮動小数点数の比較
br分岐(条件付きまたは無条件)
ret戻り
bitcastビットを再解釈します(コード生成では何もしません)
ptrtoint/inttoptrポインター↔整数(可能な限り避けてください)
5. 主なパス
パス効果
mem2regalloca を SSA レジスターに昇格します
instcombine命令の結合/ピープホール最適化
simplifycfgCFG のクリーンアップ、デッドブロックの削除
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-profdataPGO プロファイルのマージ/表示
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 と組み合わせて使用してください

コメント