8.3
深览指数
科技Bestblogs·Hacker News··AI 生成

rat 的寄存器分配器

作者重写了 Rat 编译器的寄存器分配器,用仅 584 行的优先级装箱分配器替换了原有的 1392 行线性扫描实现,并证明更少的代码能生成更优质的代码。通过实证消融测试,作者发现昂贵且复杂的优化(如寄存器驱逐、乐观二次遍历)收益极低,而简单的技术(循环深度加权、副本合并)贡献了绝大部分的代码质量提升。文章适合对编译器后端、性能优化和“少即是多”工程哲学感兴趣的开发者阅读。原文 ↗

核心观点
  • ▍通过剔除无效的复杂优化并采用精简的优先级装箱算法,可以用更少的代码(584 行 vs 1392 行)实现比原有线性扫描分配器更快、代码质量更好的寄存器分配器。
  1. 01新分配器生成的指令数减少了 3.6%,存储指令减少了 22%。
  2. 02SQLite 的编译时间缩短了 43%。
  3. 03消融测试显示,乐观二次遍历消耗了旧分配器 37% 的运行时间,却仅减少了 0.01% 的指令。
  4. 04副本合并和生命周期空隙这两个简单技术,贡献了近一半的整体收益。
  5. 05通过位图设计建模物理寄存器和调用者保存寄存器,自然地满足了调用约定规则,无需编写额外的临时规则。
  6. 06分配器按循环深度加权的引用频率评估活跃区间,并结合区间长度的平方根进行归一化,确保高频短生命周期的变量优先分配。
反方 / 局限
  • — 作者明确指出,这个简化的分配器是为其特定编译器和架构设计的,可能不适用于需要处理复杂指令集(如 x86 的除法指令对固定寄存器的严格约束)或需要精细控制寄存器压力的场景。
  • — 文章没有讨论极端情况下(如寄存器压力巨大时)该简化算法的退化表现,可能存在未被覆盖的瓶颈。
3 分钟 · 3 卡片 · 4 资料
读原文 →

前置背景

平行视角

延伸追问