关于 llvm-ir-and-passes
这项技能帮助 Agent 阅读和分析 LLVM IR 及其优化流程,涵盖 SSA 概念和使用 LLVM 工具检查转换,并补充工具链与编写 Pass 的资料。
主要功能
- 01LLVM IR 与 SSA 概念
- 02使用 Clang 生成 IR
- 03标准优化流程
- 04检查分析 Pass
- 05比较优化前后的 IR
适用场景
- 01理解 -O2 产生的变化
- 02调查不同 Clang 版本间的错误编译
- 03学习 SSA 与支配关系
- 04为编写自定义 Pass 做准备
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill llvm-ir-and-passes安装后在 Claude Code 中输入/llvm-ir-and-passes确认已加载。
详细介绍
LLVM IR 与 Pass
目的
教会 Agent 阅读和分析 LLVM IR(SSA、类型、终结指令),了解标准 Pass 流程,并使用 opt/llvm-dis 进行检查。与 skills/compilers/llvm(工具链)和 skills/compiler-internals/llvm-passes(编写插件)互为补充,不合并。
使用场景
- 了解
-O2对生成的 IR 做了哪些修改 - 排查不同 Clang 版本间的错误编译
- 准备编写自定义 Pass
- 在尚未编写 C++ Pass 的情况下讲解 SSA 和支配关系
工作流
1. LLVM IR 结构
; Function in SSA form
define i32 @add(i32 %a, i32 %b) {
entry:
%sum = add i32 %a, %b
ret i32 %sum
}
关键概念:基本块、合并处的 PHI 节点、带类型的值(i32、ptr、向量)。
2. 从 Clang 生成 IR
clang -S -emit-llvm -O0 -o foo.ll foo.c
clang -c -emit-llvm -O2 -o foo.bc foo.c
llvm-dis foo.bc -o foo.ll
3. 标准优化流程(New PM)
Clang -O2 大致会运行:
SimplifyCFG → InstCombine → GVN → LICM → LoopVectorize → ...
使用以下命令检查:
opt -passes='default<O2>' -S foo.ll -o foo-opt.ll
opt -passes='default<O2>' -print-passes foo.ll 2>&1 | head
4. 实用的分析 Pass
| Pass | 显示内容 |
|---|---|
-passes=print<domtree> | 支配树 |
-passes=print<loops> | 循环嵌套 |
-passes=print-alias-sets | 别名集合 |
opt -passes='print<domtree>' -disable-output foo.ll
5. 阅读 PHI 和 UB
merge:
%v = phi i32 [ %a, %then ], [ %b, %else ]
IR 中的 undef 和 poison 用于建模 LLVM poison 语义——它们与 C UB 不同,但相关。
6. 比较前后结果
opt -passes='instcombine,simplifycfg' -S foo.ll -o - | diff -u foo.ll -
7. Agent 用法
/llvm-ir-and-passes Explain this PHI node and which pass likely created it
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
| 找不到 Pass | LLVM 版本更名 | 对你的构建运行 opt --print-passes |
| IR 不匹配 | LLVM 主版本不同 | 使用版本匹配的 clang/opt |
"optnone" 阻止优化 | -O0 属性 | 使用 -O1+ 编译 |
| IR 过大 | 内联头文件 | 关闭 -fno-discard-value-names;筛选函数 |
| 流程错误 | Legacy 与 NPM 不同 | 使用 -passes= 语法 |
相关技能
skills/compilers/llvm— 工具链概览skills/compiler-internals/llvm-passes— 编写 PassPluginskills/compiler-internals/compiler-optimizations-deep— RA 和 ISelskills/compiler-internals/compiler-frontend— IR 生成skills/rust/rustc-basics—rustc --emit=llvm-ir
评论
支持 Markdown