mcpField
C
compiler-optimizations-deep

compiler-optimizations-deep

github.com/mohitmishra786开发269323 次安装18 周前更新
代码仓库

关于 compiler-optimizations-deep

面向编译器工程师和性能开发者的技能,讲解编译器选项之外的优化阶段,涵盖向量化、寄存器分配、PGO 和链接后 BOLT。

主要功能

  1. 01编译器流水线概览
  2. 02向量化失败排查
  3. 03寄存器分配与溢出
  4. 04Clang PGO 工作流
  5. 05链接后 BOLT 优化
  6. 06优化阶段交互说明

适用场景

  1. 01排查 LLVM 未能向量化的循环
  2. 02解释寄存器压力与栈溢出
  3. 03规划 PGO 或 BOLT 的使用
  4. 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