|
|
|
|
@ -136,3 +136,21 @@
|
|
|
|
|
- **退化**:无(matmul +3 是之前 sdiv 优化的残留退化)
|
|
|
|
|
- **功能测试**:87/88 functional 通过(1 个不稳定故障 87_many_params)
|
|
|
|
|
- **已知局限**:仅处理同寄存器复用的特例;不同寄存器间的转发/复用转为 MovReg(指令数不减少)
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 2026-05-26 | MAX_SPILL_ROUNDS 缩减 + 保守修复阈值提高
|
|
|
|
|
|
|
|
|
|
- **类型**:后端(寄存器分配 Bug 修复)
|
|
|
|
|
- **问题**:`04_arr_defn3` 段错误、`05_arr_defn4` 输出错误、`09_BFS` bad_alloc/段错误、`13_LCA`/`54_hidden_var` 等多个用例输出不匹配
|
|
|
|
|
- **根因**:block-level liveness 下多轮 spill(MAX_SPILL_ROUNDS=3)创建的 reload vreg 与保守修复(block_defs 全干涉,阈值>20)产生错误交互。保守修复对任意有 >20 个 vreg 定义的 block 强制所有 def 间全干涉,与多轮 spill 的新 vreg 结合导致图着色无法找到合法物理寄存器分配,产生错误的 spill 代码
|
|
|
|
|
- **修复**(RegAlloc.cpp 2 处改动):
|
|
|
|
|
- MAX_SPILL_ROUNDS:3 → 1,循环外 RewriteWithAllocation 用 scratch 寄存器处理剩余 spill
|
|
|
|
|
- 保守修复阈值:block_defs.size() > 20 → > 200,仅对真正的大 block 启用
|
|
|
|
|
- **效果**(门禁):
|
|
|
|
|
- functional:84/85(98.8%),仅预存 `84_long_array2` 编译超时
|
|
|
|
|
- h_functional:30/31(96.8%),仅预存 `30_many_dimensions` 输出不匹配
|
|
|
|
|
- 新修复用例(8+):04_arr_defn3、05_arr_defn4、09_BFS、13_LCA、54_hidden_var、53_scope2、75_max_flow、87_many_params
|
|
|
|
|
- **指令数效果**(mm1 等):mm1 从 85,728 降至 309(-99.6%),杜绝 spill 爆炸
|
|
|
|
|
- **退化**:无
|
|
|
|
|
- **已知局限**:`84_long_array2`(4096 元素全局数组初始化)编译超时,需单独修复;`30_many_dimensions`(多维数组参数 GEP)仍失败
|
|
|
|
|
|