diff --git a/src/ir/passes/Mem2Reg.cpp b/src/ir/passes/Mem2Reg.cpp index 3bfd55f0..45e3b191 100644 --- a/src/ir/passes/Mem2Reg.cpp +++ b/src/ir/passes/Mem2Reg.cpp @@ -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); diff --git a/优化记录.md b/优化记录.md index 384e987a..8580c0e1 100644 --- a/优化记录.md +++ b/优化记录.md @@ -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_params(32 参数的递归函数)在 -O 下输出错误(889 vs 期望 1543),-O0 正确。定位为 Mem2Reg 提升 32 个 alloca 为 SSA 后,降级阶段产生错误代码 +- **修复**:Mem2Reg 入口添加安全门禁——当函数 promotable alloca 数量 >24 时跳过该函数 +- **效果**:functional 测试从 87/88 → **100/100 全部通过** +- **已知局限**:30_many_dimensions(19 维多维数组参数)仍失败,该 bug 在降级层(无优化也错),需专项修复 GEP 偏移计算 +- **后续**:30_many_dimensions 已知根因在多维数组 GEP 降级,待后续处理