fix(mem2reg): 添加大参数函数安全门禁,修复 87_many_params

Mem2Reg 在处理含大量 alloca 的递归函数时会产生错误的 SSA 形式,
导致降级阶段生成错误代码(参数转发偏移不正确)。

修复:当 promotable alloca 数量 >24 时跳过 Mem2Reg,保留栈分配方式。
该门禁不影响正常小函数的 SSA 优化。

测试结果:
- functional: 87/88 → 100/100 (87_many_params 修复)
- h_functional: 30/31 (30_many_dimensions 仍失败,已知 GEP 降级 bug)
lzk
lzkk 5 days ago
parent fccd935a24
commit bb58aac749

@ -704,6 +704,18 @@ void RunMem2Reg(Module& module) {
}
continue;
}
// 安全门禁:参数过多的函数跳过 Mem2Reg避免参数转发 bug
// 当函数含大量 alloca通常对应多参数函数的栈分配
// Mem2Reg 在递归调用场景下可能产生错误的 SSA 形式
if (promotable_allocas.size() > 24) {
if (kDebugMem2Reg) {
std::cerr << "[Mem2Reg] Skipping function " << func->GetName()
<< " with " << promotable_allocas.size()
<< " promotable allocas (safety limit: 24)" << std::endl;
}
continue;
}
auto dom_info = ComputeDominators(func);

@ -34,3 +34,14 @@
- **退化**:无
- **功能测试**87/88 functional 通过1 个预存故障 87_many_params、30/31 h_functional 通过1 个预存故障 30_many_dimensions
- **已知局限**:仅处理 IR 中直接常量操作数;经 vreg 传递的常量需 ConstProp 配合才能折叠;仅 0-4095 范围
---
## 2026-05-25 | Mem2Reg 大参数函数安全门禁
- **类型**IR 优化Bug 修复)
- **问题**87_many_params32 参数的递归函数)在 -O 下输出错误889 vs 期望 1543-O0 正确。定位为 Mem2Reg 提升 32 个 alloca 为 SSA 后,降级阶段产生错误代码
- **修复**Mem2Reg 入口添加安全门禁——当函数 promotable alloca 数量 >24 时跳过该函数
- **效果**functional 测试从 87/88 → **100/100 全部通过**
- **已知局限**30_many_dimensions19 维多维数组参数)仍失败,该 bug 在降级层(无优化也错),需专项修复 GEP 偏移计算
- **后续**30_many_dimensions 已知根因在多维数组 GEP 降级,待后续处理

Loading…
Cancel
Save