关于 compiler-optimizations-deep
面向编译器工程师和性能开发者的技能,讲解编译器选项之外的优化阶段,涵盖向量化、寄存器分配、PGO 和链接后 BOLT。
主要功能
- 01编译器流水线概览
- 02向量化失败排查
- 03寄存器分配与溢出
- 04Clang PGO 工作流
- 05链接后 BOLT 优化
- 06优化阶段交互说明
适用场景
- 01排查 LLVM 未能向量化的循环
- 02解释寄存器压力与栈溢出
- 03规划 PGO 或 BOLT 的使用
- 04比较 GCC 与 Clang 的输出
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill compiler-optimizations-deep安装后在 Claude Code 中输入/compiler-optimizations-deep确认已加载。
详细介绍
编译器优化(深入)
目的
说明标志选项之外的优化阶段:中层 IR 优化、寄存器分配、指令选择与调度、向量化边界、PGO 和链接后 BOLT,并衔接 skills/compilers/pgo 与 LLVM/GCC 内部机制。
适用场景
-O3未能向量化热点循环- 讲解寄存器压力为何会导致溢出
- 规划 PGO 或 BOLT 部署
- 理解优化阶段间的相互作用(例如,先执行 LICM,再进行向量化)
工作流
1. 编译器流水线图
Frontend → LLVM IR / GCC GIMPLE
├── Mid-level: DCE, GVN, LICM, inlining
├── Loop opts: unroll, vectorize
├── Codegen prep: legalize types
├── Instruction selection (DAG → machine ops)
├── Register allocation (greedy, linear scan)
└── Peephole / scheduling
2. 向量化失败排查
clang -O3 -Rpass=loop-vectorize -Rpass-missed=loop-vectorize foo.c
| 未命中原因 | 常见修复方法 |
|---|---|
| 迭代次数未知 | 拆分循环;断言迭代次数 |
| 存在依赖关系 | 调整顺序/拆分累加器 |
| 循环中有函数调用 | 内联或提取为独立函数 |
| 对齐方式未知 | __builtin_assume_aligned |
3. 寄存器分配直觉
当活跃区间超出物理寄存器数量时,分配器会将值溢出到栈槽中,导致代价高昂的加载/存储操作。缩短活跃区间(拆分变量、重新计算值)会有所帮助。
GCC/LLVM 都使用图着色的变体(LLVM 的“greedy regalloc”)。
4. PGO 工作流(Clang)
clang -fprofile-instr-generate -O2 -o app foo.c
./app # training workload
llvm-profdata merge default.profraw -o default.profdata
clang -fprofile-instr-use=default.profdata -O2 -o app_pgo foo.c
可改善分支布局、内联和向量化阈值。
GCC 和 BOLT 的相关内容请参阅 skills/compilers/pgo。
5. BOLT(链接后)
llvm-bolt -instrument app -o app.inst
./app.inst
llvm-bolt -data=perf.fdata -reorder-blocks=+ -o app.bolt app
在链接器处理后优化布局——需要重定位信息(-Wl,--emit-relocs)。
6. LICM 示例
在符合条件时,循环不变代码外提会将 x * scale 从内层循环中提出来,从而减少每次迭代的工作量。
7. Agent 用法
/compiler-optimizations-deep Why did LLVM fail to vectorize this reduction loop?
常见问题
| 现象 | 原因 | 修复方法 |
|---|---|---|
| PGO 没有收益 | 训练数据缺乏代表性 | 使用与生产环境匹配的输入 |
| BOLT 崩溃 | 二进制已剥离符号 | 保留符号和重定位信息 |
| 汇编中出现溢出 | 寄存器压力 | 简化活跃区间 |
-O3 更慢 | 代码膨胀/缓存问题 | 尝试 -O2 或 PGO |
| GCC/Clang 结果不同 | 优化阶段顺序不同 | 对比 IR 和汇编 |
相关技能
skills/compilers/pgo— PGO 和 BOLT 详解skills/compiler-internals/llvm-ir-and-passes— IR 层级优化skills/compiler-internals/code-generation-and-backends— ISel 和后端skills/computer-architecture/cpu-pipelines-and-hazards— 调度相关背景skills/low-level-programming/simd-intrinsics— 手动向量化
评论
支持 Markdown