追查 antcc 在 -O2 下的性能倒退
来源:386s.org — 2026-10-12
📋 概述
作者在给自研 C 编译器 antcc 跑 Lua 基准时发现怪事:-O2 比 -O1 慢 1.4 倍。禁用内联后倒退消失,但代码膨胀只是表象——luaV_execute 在 -O2 下膨胀到约 43KB,是 -O1 的 2.4 倍,而优化后的 IR 只大了 11%。他把矛头指向代码生成阶段,最终定位在寄存器分配:线性扫描分配器在寄存器压力下大量溢出,-O2 的 IR 过 regalloc 后膨胀到 +70%,反汇编显示 luaV_execute 里超过 40% 的指令只是栈与寄存器之间的 mov。根因是内联让大量变量的支配写入与 phi 节点被 mem2reg 变成 undef,进而破坏了分支相关性与活跃区间分析。修好之后 antcc 甚至超过了 tcc;期间他用 AI 代理帮忙筛选反汇编与 IR、试不同阈值并测量,但代理在找根因上不行,提了约十个复杂「修复」都无效。
🔑 核心要点
- 现象:-O2 跑 Lua 基准比 -O1 慢 1.4 倍,禁用内联后倒退消失
- 代码膨胀:luaV_execute 在 -O2 下约 43KB,是 -O1 的 2.4 倍,而优化后的 IR 只大 11%
- 元凶是寄存器分配:-O2 的 IR 过 regalloc 后膨胀到 +70%
- 反汇编显示 luaV_execute 里超过 40% 的指令只是栈与寄存器之间的 mov
- 根因:内联让变量的支配写入与 phi 节点被 mem2reg 变成 undef,破坏了分支相关性分析
- AI 代理在筛选反汇编、试不同内联阈值并测量上省了很多时间,但在找根因上不行,提了约十个复杂「修复」都无效
💡 金句
代理在调查、筛选反汇编与 IR、用不同内联阈值跑编译器并测量上帮我省了大量时间;但它不擅长找根因。
👍 0
👎 0
← 返回 Lobsters 首页