关于 llvm
面向使用 LLVM 工具的 Agent,提供 IR 生成、检查、优化和降级为汇编的操作指南。还介绍诊断未触发优化的原因,并区分了编写自定义 LLVM pass 的相关技能。
主要功能
- 01生成文本 IR 和 bitcode
- 02使用 opt 运行优化 pass
- 03用 llc 降级为汇编
- 04检查 IR 指令与结构
- 05诊断未触发的优化
适用场景
- 01查看 C 函数生成的 LLVM IR
- 02对 IR 应用优化 pass
- 03排查循环未自动向量化
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill llvm安装后在 Claude Code 中输入/llvm确认已加载。
附带文件references/ir-reference.md
详细介绍
LLVM IR 和工具链
用途
指导 Agent 以用户的身份使用 LLVM:生成和检查 IR、使用 opt 运行现有优化 Pass、使用 llc 降低为汇编,以及诊断优化未生效的原因。若要编写新的 LLVM Pass(PassPlugin、llvm-lit 测试),请改用 skills/compiler-internals/llvm-passes。
触发条件
- “显示这个函数的 LLVM IR”
- “如何运行 LLVM 优化 Pass?”
- “这条 LLVM IR 指令是什么意思?”
- “如何编写自定义 LLVM Pass?”
- “为什么 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 运行优化 Pass
# 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. 关键 Pass
| Pass | 效果 |
|---|---|
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 Pass,请使用
skills/compiler-internals/llvm-passes - 从 AST 生成 LLVM IR,请使用
skills/compiler-internals/compiler-frontend - 使用 ORC JIT 执行 LLVM IR,请使用
skills/compiler-internals/jit-compilation - 查看源代码级 Clang 标志,请使用
skills/compilers/clang - 在链接时使用 LTO,请使用
skills/binaries/linkers-lto - 结合
llvm-mca进行微架构分析,请使用skills/profilers/linux-perf
评论
支持 Markdown